gpt4 book ai didi

c++ - 模板化转换构造函数无法访问 protected 数据成员

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:09 25 4
gpt4 key购买 nike

我有一个带有转换构造函数的模板化类 Rect,它允许 Rect 到 Rect 之间的转换,反之亦然。但是在编译代码时,编译器给出了一个错误,指出构造函数无法访问类的 protected 成员。这是代码:

#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

我想在不使用模板特化和创建友元类的情况下解决这个问题。据我所知,您不能将构造函数声明为 friend 。有什么想法吗?

编辑:我对语义进行了更正。所以我要构建的构造函数实际上是一个转换构造函数。

Edit2:更正了程序。

最佳答案

您应该知道的第一件事是模板构造函数 永远不是复制构造函数。第二件事是Rect<T>Rect<U>其中 T != U是不同的不相关类,与 std::string 一样不相关和一个 std::vector .

您应该提供某种方式来访问 widthheight ,并且您的转换构造函数 应该使用此类访问方法来创建新的 Rect .

关于c++ - 模板化转换构造函数无法访问 protected 数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11001480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com