【发布时间】:2013-08-09 11:16:09
【问题描述】:
我目前正在做一个我使用的项目:
- 增强库 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)) { }
提前感谢您的意见!
【问题讨论】:
标签: c++ const-cast boost-foreach cxxtest