我目前正在做一个我使用的项目:
- 提升库 v1.39
- Eclipse CDT (Juno) 和 Cygwin
- CxxTest 插件:http ://wiki.web-cat.org/WCWiki/EclipsePlugins/CxxTestPlugin
我遇到了一个关于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 引用。
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 的右值检查,使用 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
禁用此
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)) { }
感谢您提前输入!