VTK VisualStudio2013编译错误

时间:2014-04-15 17:11:35

标签: c++ visual-studio-2012 vtk

我试图在windows7和Visual Studio2013中编译VTK5.10.1(vs2012 C ++编译器,所以我猜有人可能会在2012年遇到同样的问题)

修复了一些小bug和一些丢失的头文件 关注VTK wiki的tuitols。在最后一步:

我收到两个错误

  1. C2678:二进制'<<&# :找不到哪个运算符采用类型为' std :: ostream'的左手操作数。 (或没有可接受的转换)
  2.   

    #define VTKOSTREAM_OPERATOR(type)\ vtkOStreamWrapper&   vtkOStreamWrapper :: operator<< (a))       {this-> ostr<<一个;返回*这个; }

    VTKOSTREAM_OPERATOR(ostream&);
    

    2.binary' ==' :找不到哪个运算符采用了类型' std :: basic_istream>'的左手操作数。 (或者没有可接受的转换)

     if ( this->IFile->read(result, 80) == 0)
    

    此处源代码托盘在std :: basic_istream>之间运行operator ==和int

    但是在std :: istream中,operator ==不是覆盖。

    等待帮助。 感谢

1 个答案:

答案 0 :(得分:3)

在Win 8.1 + VS2013x64中构建VTK 5.8.0时,我遇到了完全相同的错误。

这是我的解决方案:

  1. 替换宏后,错误转到operator<<的定义。编译器需要找到与

    匹配的声明
    this->ostr << a;
    

    其中this->ostra的类型均为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;
    }
    
  2. 自代码

    if ( this->IFile->read(result, 80) == 0)
    

    实际上是一种C ++ 11方法来确定ifstream->read()是否成功(ostream可以自动转换为bool),VS2013不支持。我将所有这些都改为标准形式:

    if ( this->IFile->read(result, 80).fail())