#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;
}
我尝试在ideone.com上编译它并运行良好,但在Visual中它并没有取得进展。
答案 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);