我正在尝试将临时对象传递给另一个对象构造函数,以便第二个对象获取所生成对象的所有权。我的代码是这样的
class A {
};
class B {
A a;
public:
B(A && _a) : a(_a) {}
void test(){ }
};
int main(int argc, const char *argv[])
{
B b(A());
b.test();
return 0;
}
但是我收到了这个我无法理解的错误
$ g++ -std=c++0x main.cpp
main.cpp: In function 'int main(int, const char**)':
main.cpp:15:7: error: request for member 'test' in 'b', which is of non-class type 'B(A (*)())'
也许这只是一个愚蠢的语法错误,但如果不是,你会如何定义这样的构造函数来获取某些创建资源的所有权?
由于
答案 0 :(得分:3)
你被所谓的C ++最令人烦恼的解析所抓住了。你的行
B b(A());
不定义使用b
类型的临时对象初始化的B
类型的对象A
,但声明函数 named b
使用一个未命名的类型(指向a)函数的参数,不带参数并返回A
(因此b
的参数类型被声明为函数类型{{ 1}}并衰减到您可以在错误消息中看到的指针到函数类型A()
,并返回一个B.
最简单的方法是将该行更改为
A(*)()
在C ++ 11中,最好的选择是使用新的初始化程序语法并编写
B b = B(A());