我有以下代码
#include <iostream>
#include <string>
template <typename T>
class demo
{
T data;
public:
demo();
demo(demo const&k );
demo(const T&k);
demo& operator=(const demo &k);
template<typename T1>
demo(const demo<T1>&k);
template<typename T1>
demo<T>& operator=(const demo<T1>&k);
~demo();
};
template <typename T>
demo<T>::demo():data(){}
template<typename T>
demo<T>::demo(demo const& k):data(k.data){}
template<typename T>
demo<T>::demo(const T&k):data(k){}
template<typename T>
demo<T>& demo<T>::operator=(demo const &k)
{
if ((void*)this == (void*)&k) { // assignment to itself?
return *this;
}
this->data=k.data;
return *this;
}
template<typename T>
template<typename T1>
demo<T>& demo<T>::operator=(demo<T1> const &k)
{
if ((void*)this == (void*)&k) { // assignment to itself?
return *this;
}
this->data=k.data;
return *this;
}
template<typename T>
template<typename T1>
demo<T>::demo(const demo<T1>&k):data(k.data){}
template<typename T>
demo<T>::~demo(){}
int main()
{
demo<std::string> k(std::string("hello"));
demo<std::string >l=k;
demo<int> x(10);
demo<double> p=x; //error here
}
为什么我在这里收到错误?据我所知p
正在复制初始化为x
。所以
demo<T>::demo(const demo<T1>&k):data(k.data){}
被调用。但由于data
是私人成员,我收到错误'demo<T>::data' : cannot access private member declared in class 'demo<T>'
。为什么?
我知道类的成员函数可以访问私有成员,为什么我会收到错误?我该怎么做才能纠正错误?
答案 0 :(得分:8)
由于demo<T>
和demo<T1>
被视为不同类型,因此他们可能无法访问彼此的私人数据。
解决这个问题的简单方法是添加公共访问器功能并使用它:
template <typename T>
class demo
{
public:
const T &get_data() const { return data; }
...
};
template<typename T>
template<typename T1>
demo<T>::demo(const demo<T1>&k):data(k.get_data()){}
答案 1 :(得分:3)
在我之前R Samuel Klatchko回答,demo<T>
和demo<T1>
的类型不同。
问题的解决方案是声明其他类朋友:
class demo
{
T data;
public:
demo();
demo(demo const&k );
demo(const T&k);
demo& operator=(const demo &k);
template<typename T1>
demo(const demo<T1>&k);
template<typename T1>
demo<T>& operator=(const demo<T1>&k);
~demo();
template<typename T1> // This will enable demo<T> and demo<T1>
friend class demo ; // to see each other's privates as friends
// ought to do...
};