[英]passing an unnamed object as an argument when making a new object in C++
我想在构造函数中使用未命名的 object 作为参数,但它会产生以下错误。
我猜 object 名称 'b2' 被解释为 function 原型或其他东西。
class AAA
{
private:
int m_val;
public:
AAA(int a) : m_val(a) {}
};
class BBB
{
private:
AAA a;
public:
BBB(AAA &a_) : a(a_) {}
};
int main()
{
AAA a(5), a1(10);
BBB b(a), b1(a1);
b = b1;
BBB b2(AAA());
b = b2;
}
.\ex_unnamed.cpp: In function 'int main()':
.\ex_unnamed.cpp:21:9: error: no match for 'operator=' (operand types are 'BBB' and 'BBB(AAA (*)())')
b = b2;
^~
.\ex_unnamed.cpp:8:7: note: candidate: 'constexpr BBB& BBB::operator=(const BBB&)'
class BBB
^~~
.\ex_unnamed.cpp:8:7: note: no known conversion for argument 1 from 'BBB(AAA (*)())' to 'const BBB&'
.\ex_unnamed.cpp:8:7: note: candidate: 'constexpr BBB& BBB::operator=(BBB&&)'
.\ex_unnamed.cpp:8:7: note: no known conversion for argument 1 from 'BBB(AAA (*)())' to 'BBB&&'
首先,这并不意味着您认为它意味着什么:
BBB b2( AAA() );
b2
实际上被编译器解释为一个名为b2
的 function 的声明,它接受一个 function 指针,该指针返回一个AAA
作为参数,并返回一个BBB
。
对于我的编译器,请查看签名:
所以这失败了:
b = b2;
因为BBB
没有赋值运算符,它采用 function 等。
您可以通过执行以下操作来解决此问题:
int main()
{
AAA a(5), a1(10);
BBB b(a), b1(a1);
b = b1;
BBB b2( AAA(5) );
b = b2;
}
但它仍然无法编译。 这是因为BBB
需要参考实际的AAA
object。
要解决此问题,由于您实际上并未更改传递的AAA
object,因此我建议您将BBB
的构造函数更改为:
BBB(const AAA& a_) : a(a_) {}
毕竟, BBB::a
只是BBB
的构造函数中传递的参数的副本。 最终结果:
class AAA
{
private:
int m_val;
public:
AAA(int a) : m_val(a) {}
};
class BBB
{
private:
AAA a;
public:
BBB(const AAA& a_) : a(a_) {}
};
int main()
{
AAA a(5), a1(10);
BBB b(a), b1(a1);
b = b1;
BBB b2( AAA(5) );
b = b2;
}
有用!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.