2010-06-30 84 views
1

这工作得很好:C++:结构初始化和地图

#include <iostream> 
#include <map> 

using namespace std; 

struct Bar 
{ 
    int i; 
    int f; 
}; 

int main() 
    { 
     map<int, Bar> m; 

    Bar b; 
    b.i = 1; 
    b.f = 2; 
    m[0] = b; 
} 

但是,如果我想让它有点更简洁,我得到的错误:

int main() 
{ 
    map<int, Bar> m; 

    m[0] = {1, 2}; 
} 

有没有什么方法,使结构初始化语法工作?我做错了,还是禁止使用地图?

回答

6

您可以添加一个构造函数:
在这种情况下,我会说这是比花哨的新初始化更好,因为它实际上让维护人员看到正在放什么类型的地图,而不必去寻找它。

struct Bar 
{ 
    Bar(int anI,int aJ) 
     :i(anI), j(aJ) 
    {} 
    int i; 
    int j; 
} 

..... 

m[0] = Bar(1,2); 
3

编号

不符合现行标准(C++ 03)。

但是,如果您使用的编译器实现了new initialization syntax of C++0xlike a recent version of gcc),则可以这样做。

+5

+1。下一个标准甚至允许'map m {{0,{1,2}}};' – 2010-06-30 21:31:52

+0

Johannes>甚至没有想过这种可能性,谢谢***ç***。我们会进入初始化乐园。 :d – Klaim 2010-06-30 21:33:00

0

适合我。

使用: gcc版本4.4.4 20100503(红帽4.4.4-2)(GCC)

后者语法引发警告,但仍编译,显然这是C++ 0X语法:

警告:扩展初始化程序列表仅适用于-std = C++ 0x或-std = gnu ++ 0x

添加该开关并且-Wall编译正常。也许升级你的编译器?