error: default argument for parameter of type ‘bar<int>&’ has type ‘bar<int>’
error: default argument for parameter of type ‘bar<int>&’ has type ‘bar<int>’
编译时出现上述错误,请问如何解决。
请帮我解决这个问题
#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;
}
编译:g++ -std=c++11 ctor_call.cpp
您正在为应该在此行中通过引用传递的参数提供默认参数:
explicit foo(ctor& c = ctor());
这里,ctor&
是对类型 ctor
对象的引用。因此,只要您有对它的引用,该对象就需要存在。但是默认参数将其设置为等于 destroyed soon. And since temporary objects are not standardized, it could be destroyed before the constructor begins, so you'd be left with a reference to nothing. There's a nice explanation of all this in this answer.
的临时对象
你的情况只是模板有点复杂,所以让我们更具体一点。默认 ctor()
是对您要引用的对象的构造函数的调用。在你的例子中,class 是 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);
编译时出现上述错误,请问如何解决。 请帮我解决这个问题
#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;
}
编译:g++ -std=c++11 ctor_call.cpp
您正在为应该在此行中通过引用传递的参数提供默认参数:
explicit foo(ctor& c = ctor());
这里,ctor&
是对类型 ctor
对象的引用。因此,只要您有对它的引用,该对象就需要存在。但是默认参数将其设置为等于 destroyed soon. And since temporary objects are not standardized, it could be destroyed before the constructor begins, so you'd be left with a reference to nothing. There's a nice explanation of all this in this answer.
你的情况只是模板有点复杂,所以让我们更具体一点。默认 ctor()
是对您要引用的对象的构造函数的调用。在你的例子中,class 是 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);