VS2012 - > VS2013升级使我的一些代码不再编译

时间:2013-12-01 21:09:05

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

我的项目包含一个类:

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

但这并不能解决更大的问题。有线索吗?

0 个答案:

没有答案