我正在尝试在windows7和Visual Studio2013中编译VTK5.10.1(vs2012 C++编译器,所以我猜有人可能在2012年面临同样的问题)
修复了一些小错误和一些丢失的头文件之后 遵循 VTK wiki 的 tuitol。最后一步:
我有两个错误
- C2678:二进制“<<”:找不到采用“std::ostream”类型左侧操作数的运算符(或者没有可接受的转换)
#define VTKOSTREAM_OPERATOR(type) \ vtkOStreamWrapper& vtkOStreamWrapper::operator << (type a) \ { this->ostr << a; return *this; }
VTKOSTREAM_OPERATOR(ostream&);
2.binary '==':找不到采用'std::basic_istream>'类型的左操作数的运算符(或者没有可接受的转换)
if ( this->IFile->read(result, 80) == 0)
这里是在std::basic_istream>和int之间运行operator==的源代码托盘
但是 int std::istream 运算符 == 不会被覆盖。
等待帮助。 谢谢
最佳答案
在 Win 8.1 + VS2013x64 中构建 VTK 5.8.0 时,我遇到了完全相同的错误。
这是我的解决方案:
替换宏后,错误转到
operator<<
的定义。编译器需要找到匹配的声明this->ostr << a;
其中
this->ostr
的类型和a
都是std::ostream &
。所以我写了一个简单的测试代码来检查VS编译器。#include <iostream> #include <sstream> void test(std::ostream &a, std::ostream &b) { a << b; } int main(int argc, char *argv[]) { std::ostringstream a,b; test(a,b); std::cout << a << std::endl; return 0; }
结果在 GCC4.7 上是正确的。似乎
ostream
被自动转换为某种指针(不是它自己的地址,但没关系,只是输出一个地址)。然而,VS2013给了我和构建VTK一样的错误!那么,让我们重写vtkOStreamWrapper::operator<< (ostream &a)
的定义://VTKOSTREAM_OPERATOR(ostream&); vtkOStreamWrapper& vtkOStreamWrapper::operator << (ostream& a) { this->ostr << (void *)&a; return *this; }
由于代码
if ( this->IFile->read(result, 80) == 0)
实际上是C++11判断是否
ifstream->read()
的方法是否成功(ostream
可以自动转换为bool
),VS2013 不支持。我将它们全部更改为标准形式:if ( this->IFile->read(result, 80).fail())
关于c++ - VTK VisualStudio2013编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23090220/