【问题标题】:Template class initialization in mainmain 中的模板类初始化
【发布时间】:2022-01-05 12:51:13
【问题描述】:
class Q
{

Q(const Q &obj) {} // copy constructor 
Q& operator= (const Q& a){} // equal op overload
}

template <class T>
class B{
   public : T x;
 B<T>(T t) {
      //  x = t; }
    
}
int main()
{
    Q a(2);
    a.init(1,0);
    a.init(2,1);
    B <Q> aa(a); // this line gives error
}

如何使用复制构造函数初始化模板类?咩(a); // 这行给出错误 我想解决它,但我不能。 错误:

没有匹配函数调用'Q::Q()'| 候选人:Q::Q(const Q&)|

候选人期望 1 个参数,提供 0 个| 候选人:Q::Q(int)|

候选人期望 1 个参数,提供 0 个|

【问题讨论】:

    标签: c++ copy-constructor template-classes


    【解决方案1】:

    解决上述错误,只需在Q 类中添加一个默认构造函数,如下所示

    class Q
    {
        Q() //default constructor
        {
          //some code here if needed
        }
    
        //other members as before
    };
    

    需要默认构造函数,因为当您编写时:

    B <Q> aa(a);
    

    然后模板参数T 被推导出为Q 类型,因为你有

    T x;
    

    在类模板B 中,它尝试使用T 类型的默认构造函数,在这种情况下只不过是Q,所以这就是为什么您需要Q 的默认构造函数。

    第二请注意,您的复制构造函数应该有一个return 语句,它目前没有。

    【讨论】:

    • 是的,它解决了问题,但是哪一行调用了默认构造函数?
    • @elections12 我在我的回答中添加了我们需要Q 的默认构造函数的原因。看看这个。基本上,当您编写B &lt;Q&gt; aa(a); 时,模板参数T 被推断为Q 类型,并且由于您在类模板B 中有T x;,它会尝试使用@987654338 类型的默认构造函数@ 在这种情况下只不过是Q。所以这就是为什么我们需要Q的默认构造函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多