gpt4 book ai didi

c++ - BOOST_FOREACH 和 cxxtest 插件的转换问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:19 24 4
gpt4 key购买 nike

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

我遇到了关于 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

右值探针

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_DETECTIONBOOST_FOREACH_NO_RVALUE_DETECTIONBOOST_FOREACH_NO_CONST_RVALUE_DETECTIONBOOST_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)) { }

提前感谢您的输入!

最佳答案

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

关于c++ - BOOST_FOREACH 和 cxxtest 插件的转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18145466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com