我在使用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这样的地方似乎暗示上面的代码应该有效。无论如何,任何帮助将不胜感激!
答案 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") {}
};