У меня есть следующий код:
#include <stdio.h>
template<int A>
class Thing
{ // 5
public:
Thing() :
data(A) {
}
template<int B>
Thing &operator=(const Thing<B> &other) {
printf("operator=: A = %d; B = %d\n", A, B);
printf("this->data = %d\n", data);
}
private:
int data;
};
int main() {
Thing<0> a, b;
Thing<1> c;
a = b;
a = c;
c = b;
return 0;
}
Мне нужно специализировать Thing<A>::operator=
для A == B
. Я пробовал это:
template<int B>
template<int A>
Thing<A> &Thing<A>::template operator=(const Thing<A> &other) { // 23
printf("operator= (specialized): A = %d; B = %d; A %c= B\n", A, B, (A == B) ? '=' : '!');
printf("this->data = %d; other.data = %d\n", data, other.data);
}
Однако я получаю ошибки компиляции с g ++:
23: error: invalid use of incomplete type ‘class Thing<B>’
5: error: declaration of ‘class Thing<B>’
Я пытался использовать if(A == B)
в operator=
без специализации. Однако я получаю ошибки при доступе к приватному члену data
, к которому мне нужно получить доступ, где A == B
.
Как правильно настроить шаблон функции-члена operator=
шаблона класса Thing
?