2012-09-27 63 views
1

如何走到这一步编译和工作原理:C++初始化列表与auto_ptr的

class MyObject { 
public: 
    MyObject() {} 
}; 

struct ItemGood { 
    int Number; 
    MyObject *Object; 

    ItemGood(int Number, MyObject *Object) { 
    this->Number = Number; 
    this->Object = Object; 
    } 
}; 

const ItemGood ItemGoodList[] = 
{ 
    { 0, new MyObject() }, 
    { 1, new MyObject() } 
}; 

而这并不在所有的编译:

class MyObject { 
public: 
    MyObject() {} 
}; 

struct ItemBad { 
    int Number; 
    std::auto_ptr<MyObject> AutoObject; 

    ItemBad(int Number, MyObject *Object) { 
    this->Number = Number; 
    AutoObject = std::auto_ptr<MyObject>(Object); 
    } 
}; 

const ItemBad ItemBadList[] = 
{ 
    { 0, new MyObject() }, 
    { 1, new MyObject() } 
}; 

错误编译器吐出的是:

没有匹配函数调用'ItemBad :: ItemBad(ItemBad)

我不明白为什么有些东西想要调用构造函数,我不明白这个构造器列表中实际发生了什么。

+0

其中c ompiler?对我来说编译得很好(gcc 4.6.1)。 –

+0

MinGW的-32 4.4,嗯,我不知道为什么出现这种情况 – oggmonster

+0

GCC 4.5.2不能编译,给出了同样的错误 – higuaro

回答

1

因为std::auto_ptr没有合适的拷贝构造函数,这意味着你的类没有合适的拷贝构造函数,这意味着它不能由临时构造 - 这就是你正在做的事情。

只是垃圾auto_ptr和移动到unique_ptr

+0

是,使一个很大的意义,将不得不等待C++ 11 :-( – oggmonster

+0

@oggmonster你什么意思是等待?C++ 11已经在这里了,编译你的程序时只需使用'-std = C++ 0x'标志。 –

1

试试这个:

ItemBad(int Number, MyObject *Object) : Number(Number), AutoObject(Object) 
{} 

好像std::auto_ptr没有你的平台上拷贝构造函数,所以它必须构造器的身体之前被初始化。

+0

还是输出海合会相同的错误4.5.2 – higuaro

0

此外,你应该避免使用初始化列表如下:

{ 0, new MyObject() } 

相反,使用构造函数:

ItemBad(0, new MyObject()) 

例如,MSVC编译器为你的“好”的变体产生的错误,以及至于“坏”的一个:只要你的班级有一个Ctor,你必须使用它,而不是初始化列表。

0

{ 0, new MyObject() }表达被替换为构造函数调用ItemGood(int Number, MyObject *Object),所以编译器使得这样的事情:

const ItemGood ItemGoodList[] = 
{ 
    ItemGood(0, new MyObject()), // temporal 'ItemGood' 1 (const &) 
    ItemGood(1, new MyObject()) // temporal 'ItemGood' 2 (const &) 
}; 

然后,对于ItemGood编译器生成的拷贝costructor被调用以填补阵列插槽每ItemGood,这里没问题

ItemBad类声明包含成员变量std::auto_ptr<MyObject> AutoObject,正如在另一个答案中指出的那样,std::auto_ptr没有copy-constructor,所以compil呃无法创建编译器生成的复制构造函数ItemBad。当应用前面的逻辑,我们得到了相同的表达式替换与ItemGood

const ItemBad ItemGoodList[] = 
{ 
    ItemBad(0, new MyObject()), // temporal 'ItemBad' 1 (const &) 
    ItemBad(1, new MyObject()) // temporal 'ItemBad' 2 (const &) 
}; 

但在这里我们没有拷贝构造函数,所以您所报告的错误发生时,使用初始化列表中ItemBad构造赢得”不能解决问题,如前所述删除MyObject分配解决不了问题,或者

ItemBad(int Number, MyObject *Object) { 
    this->Number = Number; 
    // AutoObject = std::unique_ptr<MyObject>(Object); This comment doesn't solve the problem 
} 

更改为unique_ptr,或使用升压shared_ptr