1

我目前正在做一个我使用的项目:

我遇到了一个关于const_cast. 我搜索了高低,并没有找到可以帮助我的在线资源。当我BOOST_FOREACH在测试方法中调用时出现问题。我不断收到以下错误:

/usr/include/boost/foreach.hpp: In member function 
'boost::foreach_detail_::rvalue_probe<T>::operator T&() const [with T = 
boost::unordered_map<std::basic_string<char>, std::basic_string<char> >]':

...   instantiated from here /usr/include/boost/foreach.hpp:476:90: 
error: invalid cast from type 
Dereferee::const_cast_helper<boost::foreach_detail_::rvalue_probe<boost::unordered_map<std
::basic_string<char>, std::basic_string<char> > >*> 
to type 'boost::unordered_map<std::basic_string<char>, std::basic_string<char> >*

const_cast_helper

我开始剖析问题,发现 const_cast 运算符被重载以进行一些运行时检查,我不知道是什么。总而言之,有一个Dereferee::const_cast_helper是 cxxtest 依赖项的一部分,是 const_cast 运算符的重载。

此助手取消定义 const_cast 运算符 (!)

#ifdef const_cast
#undef const_cast
#endif

最后重新引入 const_cast 运算符:

#define const_cast ::Dereferee::const_cast_helper

这样每次调用 const_cast 时,都会调用这个助手的适当构造函数。构造函数接受指针、引用、const 指针和 const 引用。

来源在这里:https ://github.com/web-cat/dereferee-with-cxxtest/blob/master/Dereferee/include/dereferee/const_cast.h

rvalue_probe

Boost 还使用强制转换来查看被迭代的集合是左值还是右值,以避免复制它/重新计算表达式。

编译器抱怨以下内容:

template<typename T>
struct rvalue_probe
{
    ...
    operator T &() const { return *reinterpret_cast<T *>(const_cast<rvalue_probe *>(this)); }
};

在我的情况下, T 是 boost::unordered_map 并且不知何故这个演员表和助手的重载打破了......

有办法解决吗?

我研究了可能的解决方案,但我不知道如何实际实现它们,我没有那么多 C++ 经验。如果我的测试中有这些编译时检查,我一点也不在乎,我可以解决这个问题。因此,任何三个方向的任何帮助都将是最有帮助的!

  1. 禁用 boost 的右值检查,使用 BOOST_WORKAROUND 和 foreach.hpp 中定义的文字

    BOOST_FOREACH_COMPILE_TIME_CONST_RVALUE_DETECTION BOOST_FOREACH_NO_RVALUE_DETECTION BOOST_FOREACH_NO_CONST_RVALUE_DETECTION BOOST_FOREACH_RUN_TIME_CONST_RVALUE_DETECTION

  2. 禁用此const_cast_helper. 当我运行我的测试程序(与测试项目不同的项目)时,我的代码按预期编译和运行,const_cast 的重载会产生问题。

  3. 实施可以修复此错误的扩展。我不知道它是否应该在const_cast_helper或中完成,rvalue_probe但它没有任何好处。

template <typename T> const_cast_helper(rvalue_probe<U>* value_to_cast) : cast_value(const_cast<U*>(value_to_cast)) { }

感谢您提前输入!

4

1 回答 1

1

经过更多的挖掘,我设法找到了解决方法。DEREFEREE_NO_CONST_CAST我为我的构建配置定义了一个符号。这阻止const_cast_helper了编译。希望没有错误会蔓延,测试现在正在运行......

于 2013-08-09T15:16:23.100 回答