我有一个带有转换构造函数的模板类 Rect,它允许 Rect 到 Rect 之间的转换,反之亦然。但是在编译代码时,编译器会给出一个错误,说明构造函数无法访问类的受保护成员。这是代码:
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
template< typename T >
class Rect{
protected:
T width, height;
public:
Rect(T a, T b){
width = a;
height = b;
}
template< typename U >
Rect(Rect<U> const &r){
width = r.width;
height = r.height;
}
int area(){
return width*height;
}
};
int main(){
Rect<int> a(3,4);
Rect<float> b(a);
cout<<b.area()<<endl;
}
这是编译错误:
test.cpp: In constructor ‘Rect<T>::Rect(const Rect<U>&) [with U = int, T = float]’:
test.cpp:28:18: instantiated from here
test.cpp:10:7: error: ‘int Rect<int>::width’ is protected
test.cpp:18:5: error: within this context
test.cpp:10:14: error: ‘int Rect<int>::height’ is protected
test.cpp:19:5: error: within this context
我想在不使用模板专业化和结交朋友类的情况下解决这个问题。据我所知,您不能将构造函数声明为朋友。有任何想法吗?
编辑:我已经对语义进行了更正。所以我试图构建的构造函数实际上是一个转换构造函数。
Edit2:更正了程序。