Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误:类型为‘;的参数的默认参数;酒吧<;int>&’;具有类型‘;酒吧<;int>’;_C++_Templates_C++11 - Fatal编程技术网

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&'类型的非常量引用无效。后一个错误实际上很好地解释了原因…”。。。