首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BOOST_FOREACH和cxxtest插件的铸造问题

BOOST_FOREACH和cxxtest插件的铸造问题
EN

Stack Overflow用户
提问于 2013-08-09 11:16:09
回答 1查看 161关注 0票数 1

我目前正在从事一个项目,我使用:

  • boost库v1.39
  • 日食CDT (Juno)和Cygwin
  • CxxTest插件:http://wiki.web-cat.org/WCWiki/EclipsePlugins/CxxTestPlugin

我遇到了一个关于const_cast的问题。我到处搜索,在网上找不到能帮我的消息来源。当我在测试方法中调用BOOST_FOREACH时,问题就出现了。我一直收到以下错误:

代码语言:javascript
复制
/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运算符(!)

代码语言:javascript
复制
#ifdef const_cast
#undef const_cast
#endif

最后,重新引入const_cast操作符:

#define const_cast ::Dereferee::const_cast_helper

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

来源在这里:cast.h

rvalue_probe

Boost还使用强制转换,以查看正在迭代的集合是否为lvalue或rvalue,以避免复制/重新计算表达式。

编译器抱怨如下:

代码语言:javascript
复制
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的rvalue检查,使用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)) { }

感谢您的提前投入!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-09 15:16:23

经过进一步的挖掘,我设法找到了一个解决办法。我为我的构建配置定义了一个符号DEREFEREE_NO_CONST_CAST。这使得const_cast_helper无法编译。希望不会有虫子爬进来,测试现在正在进行.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18145466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档