2016-11-25 57 views
2

我使用的是动态分配的首次,而编译器给了我这个警告,我无法找到其他地方:警告时动态分配内存

warning: non-static data member initializers only available with 
-std=c++11 or -std=gnu++11 

有没有办法让它desappear?我应该在乎吗? 谢谢!

+5

除了警告,你需要发布代码导​​致这一点。 –

+2

“-std = C++ 11”的哪部分不清楚? –

+4

是的,你应该关心警告。在为编译命令盲目添加一个标志以使警告消失之前,您应该了解编译器警告的问题的性质。 –

回答

5

问题:

它无关动态分配

您可能正在使用的这种方法的数据成员初始化它们是C++ 11第一部分:

class S 
{ 
    int n;    // non-static data member 
    int& r;    // non-static data member of reference type 
    int a[10] = {1, 2}; // non-static data member with initializer (C++11) 
    std::string s, *ps; // two non-static data members 
    struct NestedS { 
     std::string s; 
    } d5, *d6;   // two non-static data members of nested type 
    char bit : 2;   // two-bit bitfield 
}; 

Source

编译器告诉你,你正在使用的功能(非静态数据成员初始值设定项)只存在于C++ 11(及以上版本)中。

解决问题:

  • 你可能仅仅-std=c++11标志编译代码。
  • 或者,如果您因为某些原因想要使用较旧的标准(例如C++ 98)(如您的目标系统中没有C++ 11编译器可用),则可以避免使用此功能。

我应该在意吗?

当然,是的。不注意警告可能会导致许多问题,如溢出和未定义的行为。

+0

我对-std = C++ 11标志一无所知,我会坚决使用它!谢谢! –

3

总是关心警告!警告是有用的,事实上,你应该总是编译-Werror

,是警告你,你在预先C++编译11,但在你的代码使用的是C++ 11级初始化:

struct foo { 
    int i = 0; // initialization of non-static POD 
}; 

你有-std=c++11编译,或停止使用该功能并在构造函数中初始化数据成员。