【问题标题】:Casting problems with BOOST_FOREACH and cxxtest pluginBOOST_FOREACH 和 cxxtest 插件的铸造问题
【发布时间】:2013-08-09 11:16:09
【问题描述】:

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

我遇到了关于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 &lt;typename T&gt; const_cast_helper(rvalue_probe&lt;U&gt;* value_to_cast) : cast_value(const_cast&lt;U*&gt;(value_to_cast)) { }

提前感谢您的意见!

【问题讨论】:

    标签: c++ const-cast boost-foreach cxxtest


    【解决方案1】:

    经过一番挖掘,我设法找到了解决方法。我在构建配置中定义了一个符号 DEREFEREE_NO_CONST_CAST。这阻止了const_cast_helper 被编译。希望不会出现任何错误,测试正在运行中......

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多