为什么无法在Visual Studio 2010中编译此代码?

时间:2014-04-29 10:01:34

标签: c++

#include <complex>

using Complex   = std::complex<double>;
using Byte      = unsigned char;

auto operator*( Byte const b, Complex const& c )
    -> Complex
{ return Complex( b )*c; }

#include <iostream>
using namespace std;
auto main() -> int
{
    Byte const      b = 42;
    Complex const   c = {2, 3};         // 2 + 3*i

    cout << b*c << endl;
}

enter image description here

我尝试在ideone.com上编译它并运行良好,但在Visual中它并没有取得进展。

3 个答案:

答案 0 :(得分:2)

该代码使用尾随返回类型(例如-> Complex)和using别名,这些别名在2011年被添加到该语言中。比此更早的编译器(例如您的2010年)可能不支持它们。

使用更新的编译器,或更改函数标题并输入别名为old-school样式:

typedef std::complex<double> Complex;
typedef unsigned char Byte;

Complex operator*( Byte const b, Complex const& c )
int main()

如果仍有错误,那么您需要告诉我们它们是什么以及它们来自哪条线。

答案 1 :(得分:1)

您正在使用Visual Studio 2010中的C ++ 11。对于Visual Studio中的c ++ 11,请使用Visual Studio 2013。

答案 2 :(得分:0)

MS VC ++ 2010不支持C ++ 2011 Standard的许多功能,包括别名声明。

使用typedef声明而不是别名声明。例如

typedef std::complex<double> Complex;
typedef unsigned char Byte;

考虑到这个主要宣言

auto main() -> int
即使在C ++ 2011 Standard中,

也无效。它仅在C ++ 2014 Standard中允许。因此,如果您像往常一样声明主要

,它会更好,更具可读性
int main()

没有任何理由将main声明为

auto main() -> int

这只是一种糟糕的编程风格。

标准类复合体也有非成员运算符*。例如

template<class T> complex<T> operator*(const complex<T>& lhs, const T& rhs);
template<class T> complex<T> operator*(const T& lhs, const complex<T>& rhs);