我目前正在使用的项目:
而且我遇到了有关
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运算符的重载。该助手 undefined 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++经验。我不在乎我是否在测试中进行这些编译时检查,我可以解决此问题。因此,三个方向中的任何一个都将是最有帮助的!
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
const_cast_helper
。当我运行测试程序(与测试项目不同的项目)时,我的代码将按预期进行编译和运行,const_cast的重载会产生问题。 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)) { }
感谢您的提前输入!
最佳答案
经过更多的挖掘之后,我设法找到了解决方法。我在构建配置中定义了一个符号DEREFEREE_NO_CONST_CAST
。这阻止了const_cast_helper
的编译。希望不会出现任何错误,现在正在运行测试...
关于c++ - BOOST_FOREACH和cxxtest插件的转换问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18145466/