初始化std :: auto_ptr:“错误:不匹配调用'(std :: auto_ptr <int>)(int *)'”</int>

时间:2012-04-05 00:01:28

标签: c++ raii auto-ptr

我在使用std::auto_ptr时遇到问题。我尝试使用GCC 4.6.1在Ubuntu 11.10上编译以下内容,并收到错误消息error: no match for call to ‘(std::auto_ptr<int>) (int*)’

#include <memory>
#include <iostream>

class Toy  {

public:
    std::auto_ptr<int> foo;

    Toy() {
        foo(new int(3));
    }
};

int main() {

    Toy toy;

    std::cout << *toy.foo << std::endl;

    return 0;
}

我非常确定std::auto_ptr< T >接受T*作为构造函数的参数,但显然不是......如果这是一个微不足道或重复的问题我会道歉,但我搜索了档案,还没有找到答案。像this这样的地方似乎暗示上面的代码应该有效。无论如何,任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

要初始化类的字段,请使用初始化列表语法:

class Toy  {

public:
    std::auto_ptr<int> line;

    Toy() : line(new int(3))
    {

    }
};

否则,您可能会获得默认初始化line并使用其reset方法重新设置:

class Toy  {

public:
    std::auto_ptr<int> line;

    Toy()
    {
        line.reset(new int(3));
    }
};

但是这段代码存在更多问题;首先,new int(3)不会创建三个int的数组(我认为您认为),但它会创建一个int初始化为3。你的意思是new int[3]

但是new int[3]需要释放delete[],但auto_ptr使用普通delete,即它不打算管理数组。这是因为标准库提供的用于管理数组的解决方案是std::vector,您应该使用它而不是自制解决方案,因为std::vector几乎没有“正常”动态数组的开销。

答案 1 :(得分:1)

你的问题不在于auto_ptr,而在于C ++中的构造函数。您需要在构造函数初始化列表中初始化类成员:

Toy() : line(new int(3)) { }

请注意,这会创建一个值为int的动态3

答案 2 :(得分:0)

您没有调用构造函数。相反,您尝试调用不存在的函数调用运算符。这些会调用构造函数:

Toy() : line(new int(3)) {

或(不完全是你想要的)

Toy() {
    auto_ptr<int> line(new int(3));

或(如上所述,不是你想要的)

Toy() {
    auto_ptr<int>(new int(3));

答案 3 :(得分:0)

这不是你构造成员变量的地方。您想使用初始化列表。

Toy() 
    : line(new int(3))
{ }

在类构造函数运行之前构建成员。您可以在构造函数代码中分配它们。它们按照它们在类定义中出现的顺序构建,不按照它们在此列表中出现的顺序。如果这个列表出现故障,大多数编译器都会发出警告,因为这样可以避免混淆。您还可以使用父类的类型(因为它没有名称)

以相同的方式构造父对象
class Toy : public Thing {
   Toy() : Thing("APPLE") {}
};