没有构造函数的实例与参数列表匹配-参数类型为:

时间:2018-12-01 12:34:17

标签: c++ templates

我得到no instance of constructor "MyClass<t>::MyClass [with t=double]" matches the argument list -- argument types are: (MyClass<int>)

我只想将一个对象的值复制到另一个对象。 无需模板语法即可正常工作。

#include <iostream>
using namespace std;

template<class t>
class MyClass{
  t x,z;
  public:
    MyClass(){}
    MyClass (const t a,const t b):x(a),z(b) {
    }

    MyClass(const MyClass& obj){
        x=(t) obj.x;
        z=(t)obj.z;
    }

    // access content:
    void  content()  {
        cout<<x<<z<<endl;

    }
};


int main () {
  MyClass<int> foo(34,23);
  MyClass <double> bar(foo);

  bar.content();
  foo.content();

  return 0;
}

我搜索了很多与此相关的问题/答案,但找不到解决方法

2 个答案:

答案 0 :(得分:2)

问题在于MyClass<int>MyClass<double>是不同的类型,并且您只有一个复制构造函数,该复制构造函数采用相同类型的对象。

要使您的代码正常工作,我必须更改两件事:

template<typename u>
MyClass(const MyClass<u>& obj){
    x=(t) obj.x;
    z=(t)obj.z;
}

现在,构造函数本身已模板化(与类无关)。这样一来,您可以使用其他类型的MyClass<A>来构建MyClass<B>

但是这样做会导致另一个错误:

prog.cpp:14:19: error: ‘int MyClass<int>::x’ is private within this context
         x=(t) obj.x;

因为我们是从不相关类型的对象构造的,所以我们无权访问私有成员。

解决方法:在类中添加friend声明:

template<typename> friend class MyClass;

答案 1 :(得分:0)

MyClass是模板。当您在其声明中编写MyClass时,实际上这是MyClass<T>的简写,因此MyClass<double>没有使用MyClass<int>的构造函数。

如果要允许转换,则需要第二个模板参数,例如

template <typename T>
struct foo {};

template <typename R,typename T>
foo<R> convert_foo(const foo<T>& f) { return {}; }