我的代码如下
template <typename T>
class name
{
public:
name() : h_(0){}
template <typename U>
operator name<U>()
{
name<U> u;
u.h_ = h_;
return u;
}
private:
int h_;
};
int main(void)
{
name<int> a;
name<double> b = a;
return 0;
}
我得到的错误是int name<double>::h_ is private
。如何修复错误?
答案 0 :(得分:7)
name<int>
和name<double>
是不同的实例,因此实际上是不同的类。默认情况下,他们的私人成员无法共享。您需要将name<T>
朋友发送给所有其他name
。
template <typename T>
class name
{
public:
name() : h_(0){}
template <typename U>
operator name<U>()
{
name<U> u;
u.h_ = h_;
return u;
}
private:
int h_;
template <typename> // <--
friend class name; // <--
};
int main(void)
{
name<int> a;
name<double> b = a;
return 0;
}
答案 1 :(得分:3)
name<int>
尝试访问name<double>
的私人成员。你应该能够通过使转换函数成为朋友来修复它,但是我尝试了编译器go havoc if you try。
您还可以让name<T>
的任何name<U>
朋友来解决此问题。
template <typename T>
class name
{
public:
name() : h_(0){}
template <typename U>
operator name<U>()
{
name<U> u;
u.h_ = h_;
return u;
}
template<typename U>
friend class name; // <----
private:
int h_;
};
答案 2 :(得分:2)
name<T>
和name<U>
视为两个不同的类,并且它不允许您访问其他类的私有成员。怎么解决?重新设计或授予友谊。或提供访问者......有很多方法可以做到,最合适的一个取决于你的意图。如果我猜错了你的意图,给予友谊可能是一个好主意,但我看不到你发布的代码的全貌。
答案 3 :(得分:1)
您需要添加setter / getters(或友谊或其他内容)。问题是name<T>
和name<U>
是完全不相关的类。
或者,为什么不添加另一个构造函数name(const T &h) : h_(h) {}
?
答案 4 :(得分:0)
name<T>
可能与name<U>
不同[例如:在您的情况下]。因此,无法访问其他人的私人成员[如果T
和U
是不同的类型]。
将以下内容添加到类定义中。
template<typename U>
friend class name;
答案 5 :(得分:0)
Name<T>
可能与Name<U>
的类型不同,因此封装规则适用。使用访问者或朋友。