Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VTK VisualStudio2013 Compile Error

I'm trying to compile VTK5.10.1 in windows7 and Visual Studio2013( vs2012 C++ compiler, so I guess somebody may face the same question in 2012)

After fix some small bug and some missing head file Follow the tuitols of the VTK wiki. IN THE LAST STEP:

I got two error

  1. C2678: binary '<<' : no operator found which takes a left-hand operand of type 'std::ostream' (or there is no acceptable conversion)

#define VTKOSTREAM_OPERATOR(type) \ vtkOStreamWrapper& vtkOStreamWrapper::operator << (type a) \ { this->ostr << a; return *this; }

VTKOSTREAM_OPERATOR(ostream&);

2.binary '==' : no operator found which takes a left-hand operand of type 'std::basic_istream>' (or there is no acceptable conversion)

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

Here the source code tray to run operator== between std :: basic_istream> and int

But int the std::istream the operator== is not override.

Waiting for help. Thanks

like image 424
逆袭的龙猫 Avatar asked Oct 02 '22 00:10

逆袭的龙猫


1 Answers

I've got exactly the same errors when building VTK 5.8.0 in Win 8.1 + VS2013x64.

Here's my solution:

  1. After substituting the macros, the error goes to the definition of operator<<. The compiler need to find an declaration that matches

    this->ostr << a;
    

    where the type of this->ostr and a are both std::ostream &. So I wrote a simple test code to check the VS compiler.

    #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;
    }
    

    It turns out to be correct on GCC4.7. And seems that ostream is auto-casted to some kind of a pointer (not its own address, but it doesn't matter, just output an address). However, VS2013 gives me the same error as building VTK! So, let's make rewrite the definition of vtkOStreamWrapper::operator<< (ostream &a):

    //VTKOSTREAM_OPERATOR(ostream&);
    vtkOStreamWrapper& vtkOStreamWrapper::operator << (ostream& a) {
        this->ostr << (void *)&a;
        return *this;
    }
    
  2. Since the code

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

    actually is a C++11 way to determine whether ifstream->read() suceeds or not (a ostream can be auto-casted to a bool), which is not supported by VS2013. I change all of them into standard form:

    if ( this->IFile->read(result, 80).fail())
    
like image 106
Harry Summer Avatar answered Oct 03 '22 15:10

Harry Summer