BOOST_FOREACH和cxxtest插件的铸造问题
Casting problems with BOOST_FOREACH and cxxtest plugin
我目前正在进行一个项目,我使用的是:
- boost库v1.39
- Eclipse CDT(Juno)和Cygwin
- CxxTest插件:http://wiki.web-cat.org/WCWiki/EclipsePlugins/CxxTestPlugin
我遇到了一个关于CCD_ 1的问题。我到处搜索,都找不到可以帮助我的在线资源。当我在测试方法中调用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时,都会调用该助手的相应构造函数。构造函数接受指针、引用、常量指针和常量引用。
来源如下: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++经验。我一点也不在乎我的测试中是否会有这些编译时检查,我可以解决这个问题。所以,在这三个方向中的任何一个方向上的任何帮助都将是最有帮助的!
禁用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
禁用此
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)) { }
感谢您提前提供的意见!
经过进一步的挖掘,我设法找到了一个解决方法。我在构建配置中定义了一个符号DEREFEREE_NO_CONST_CAST
。这阻止了const_cast
0的编译。希望不会有错误出现,测试现在正在运行。。。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 从C++本机插件更新Vector3数组
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- C++ Linux 上的插件 ABI 问题
- 我在 Mac 的 Electron 中的本机C++插件有问题
- 在 Windows 10 中运行 gcc 插件的问题
- 虚幻引擎4.21.2和Squareys CISQLite3插件编译问题
- Qt插件翻译出现问题
- libsndfile 和 Photoshop 插件开发问题
- BOOST_FOREACH和cxxtest插件的铸造问题
- cmake和VS2012的Maya插件编译问题
- XLL插件开发-Excel SDK函数问题
- Dll插件基本问题
- Gradle实验插件ndk, STL相关问题
- 插件的初始化程序问题.测试
- 大型应用程序插件中的CEF关闭/调整大小问题
- C++BHO(IE插件)问题
- Visual Studio 2010/2012插件项目问题