2014-04-29 75 views
0
#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为什么此代码无法在Visual Studio 2010中编译?

我试图编译它ideone.com,它运行良好,但在视觉它不求上进。

+1

一些C++ 11个功能可能不会出现在2010年 – Ben

+0

能否请您包括错误信息在你的问题,而不是链接到一个屏幕截图? –

回答

2

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

要么使用一个更切合最新的编译器,或改变功能的标题和类型别名老派风格:

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

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

如果仍存在错误,那么你就需要告诉我们他们是什么,他们来自哪条线。

1

您在Visual Studio 2010中使用C++ 11在Visual Studio C++ 11,使用Visual Studio 2013年

0

MS VC++ 2010不支持C++ 2011标准的许多功能,包括别名宣言。使用typedef声明而不是别名声明。例如

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

考虑到acccount该声明的主要

auto main() -> int 

即使是在C++ 2011标准无效。它仅在C++ 2014标准中允许。因此,这将是更好的,更具可读性,如果你将宣布主像往常一样

int 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); 
相关问题