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
#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
I've got exactly the same errors when building VTK 5.8.0 in Win 8.1 + VS2013x64.
Here's my solution:
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;
}
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())
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With