Рассмотрим следующий фрагмент кода:
template<class T>
class Me {
private:
T* data;
size_t size;
friend class Me<?????>;
public:
Me(size_t s) : data(new T[s]), size(s) {}
virtual ~Me() { delete [] data; }
Me<T> operator= (const Me<T const>& rhs) {
for(size_t i = 0; i < size; ++i)
data[i] = rhs.data[i]; // Gives compile error "data is a private member of Me<XX const>"
}
}
Несмотря на то, что это очень надуманный пример, как правильно получить доступ к частному члену данных версии класса, отличающейся только константойT
?Если бы все пошло иначе, я мог бы просто сделать: friend class Me<T const>;
Я не хочу предоставлять способ доступа к внутреннему указателю данных в более широкий мир (даже через геттер) в моем реальном коде,Кроме того, я не делаю здесь ничего, что противоречит константности, так как я никогда не изменю правую часть уравнения.
Может быть, это абсолютно неправильный способ, нов то время это кажется совершенно разумным.
Лучше ли было бы создать бесплатную функцию?Например,
template<class T>
Me<T> operator= (const Me<T>& lhs, const Me<T const>& rhs) {...}
Этот второй подход прекрасно компилируется, но выдает ошибку ссылки (неопределенные символы), которую я до сих пор отслеживаю.