我的项目包含一个类:
struct tweaker
{
virtual std::ostream& peek(std::ostream&) const = 0;
virtual std::ostream& script(std::ostream&) const;
const char* Name;
};
和一个函数:
std::ostream& tweaker::script(std::ostream& Os) const
{
return Os << std::string(Name) << " " << peek(Os) << "; # ";
}
这是在VS2012编译的,但VS2013告诉我
1>environment_variables.cpp(28): error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'std::basic_ostream<char,std::char_traits<char>>' (or there is no acceptable conversion)
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(498): could be 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_streambuf<char,std::char_traits<char>> *)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(478): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(const void *)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(458): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(long double)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(438): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(double)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(418): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(float)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(397): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned __int64)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(377): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(__int64)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(356): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned long)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(336): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(long)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(316): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned int)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(291): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(int)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(271): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(unsigned short)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(237): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(short)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(217): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::_Bool)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(210): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(203): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_ios<char,std::char_traits<char>> &(__cdecl *)(std::basic_ios<char,std::char_traits<char>> &))'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(197): or 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_ostream<char,std::char_traits<char>> &(__cdecl *)(std::basic_ostream<char,std::char_traits<char>> &))'
1> c:\users\guy\documents\game_dev\ggl\environment_variables.h(191): or 'std::ostream &operator <<(std::ostream &,const ggl::tweaker &)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(699): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(746): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(784): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(831): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(957): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const signed char *)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(964): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,signed char)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(971): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const unsigned char *)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(978): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,unsigned char)'
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(988): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>,std::ostream>(std::basic_ostream<char,std::char_traits<char>> &&,const _Ty &)'
1> with
1> [
1> _Ty=std::ostream
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ostream(1026): or 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const std::error_code &)'
1> while trying to match the argument list '(std::basic_ostream<char,std::char_traits<char>>, std::ostream)'
我猜测MS对它所经历的内容有点挑剔,我需要在某处提供一些消歧。显而易见的解决方法是
std::ostream& tweaker::script(std::ostream& Os) const
{
Os << std::string(Name) << " ";
peek(Os);
return Os << "; # ";
}
但这并不能解决更大的问题。有线索吗?