我得到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;
}
我搜索了很多与此相关的问题/答案,但找不到解决方法
答案 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 {}; }