我在编译时遇到上述错误,如何纠正错误。 请帮我解决这个问题
#include <iostream>
using namespace std;
template <typename T>
class bar
{
public:
bar(){cout << "bar" <<"\n";}
};
template <typename T, typename ctor = bar<T>>
class foo
{
T i;
public:
explicit foo(ctor& c = ctor());
private:
ctor mctor;
};
template <typename T, typename ctor>
foo<T,ctor>::foo(ctor& c):mctor(c)
{
cout << "foo" <<"\n";
}
int main()
{
foo<int> f;
return 0;
}
compile:g ++ -std = c ++ 11 ctor_call.cpp
答案 0 :(得分:6)
您为此行中的引用传递的参数提供了默认参数:
explicit foo(ctor& c = ctor());
此处,ctor&
是对ctor
类型对象的引用。因此,只要您有对象的引用,该对象就需要存在。但是,默认参数将其设置为即将成为destroyed的临时对象。而且由于临时对象没有标准化,它可能会在构造函数开始之前被销毁,所以你不会有任何引用。在this answer中有一个很好的解释。
模板的情况稍微复杂一点,所以让我们更具体一点。默认的ctor()
是对您正在引用的对象的构造函数的调用。在您的情况下,类是foo<int>
,因此模板看起来像
template <int, typename ctor = bar<int>>
class foo
这里,模板得到第二个参数,但它是默认参数,因此你得到ctor = bar<int>
。这相当于使用foo<int, bar<int>>
。现在,在函数语句中,ctor()
实际上与bar<int>()
相同 - 它是对构造函数的调用。
1)不要传递默认值:
explicit foo(ctor& c);
2)不要通过引用传递:
explicit foo(ctor c = ctor());
3)通过 const 引用:
explicit foo(const ctor& c = ctor());
这有点神奇,因为const
使编译器keep the temporary object around直到const引用被销毁,这在foo
构造函数调用结束时出现。
4)使用foo
对象之外的东西,例如静态或全局对象。 (虽然你应该警惕静态,我们基本上都讨厌全局......):
explicit foo(ctor& c = some_ctor_object_that_exists_already);