C++ 错误:类型为‘;的参数的默认参数;酒吧<;int>&’;具有类型‘;酒吧<;int>’;
我在编译时遇到上述错误,如何更正它。 请帮我整理一下C++ 错误:类型为‘;的参数的默认参数;酒吧<;int>&’;具有类型‘;酒吧<;int>’;,c++,templates,c++11,C++,Templates,C++11,我在编译时遇到上述错误,如何更正它。 请帮我整理一下 #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; publ
#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;
}
#包括
使用名称空间std;
模板
分类栏
{
公众:
bar(){cout您正在为一个参数提供一个默认参数,该参数应该在此行中通过引用传递:
explicit foo(ctor& c = ctor());
这里,ctor&
是对类型为ctor
的对象的引用。因此,该对象需要存在一段时间,只要您有对它的引用。但是默认参数将其设置为一个即将出现的临时对象。由于临时对象没有标准化,它可能在构造函数开始之前被销毁,因此你会被留下一个什么都没有的参考。这里面有一个很好的解释
由于模板的存在,您的情况稍微复杂一点,所以让我们更具体一点。默认的ctor()
是对引用对象的构造函数的调用。在您的情况下,类是foo
,因此模板看起来像
template <int, typename ctor = bar<int>>
class foo
2) 不要通过引用传递:
explicit foo(ctor c = ctor());
explicit foo(const ctor& c = ctor());
3) 通过常量引用:
explicit foo(ctor c = ctor());
explicit foo(const ctor& c = ctor());
这有点神奇,因为const
会使编译器一直运行到const引用被销毁,这是在foo
构造函数调用结束时发生的
4) 使用foo
对象之外的对象,例如静态或全局对象(尽管您应该警惕静态,我们基本上都讨厌全局对象……):
在您的“不要通过引用传递”…中有一个引用。复制/粘贴错误?是的。已编辑。谢谢。:)谢谢您的回复。。您能否提供一些源代码,以了解模板ctor是如何用作第explicit foo行中的函数/运算符()ctor()(ctor&c=ctor())@knils抱歉,我不太明白你的评论。为了更清楚,我在回答中添加了一些内容,但如果这还不够,请再解释一下。谢谢Mike!如此清晰的解释。当我通过引用传递它时,我必须使用const作为引用,必须指向某个内存位置,并且对象暂时或暂时超出范围按值传递。bar对象离开作用域并返回到作用域的点/阶段是什么。礼貌“但默认参数将其设置为一个将因作用域而立即销毁的对象。”有趣的是,您使用哪种编译器和版本?我得到“错误:无法将'bar()'从'bar'转换为'bar&',并且“错误:使用GCC 4.9.2从'bar'类型的右值初始化'bar&'类型的非常量引用无效。后一个错误实际上很好地解释了原因…”。。。