Специализировать шаблон функции-члена шаблона класса - PullRequest
2 голосов
/ 15 июля 2009

У меня есть следующий код:

#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?

Ответы [ 2 ]

2 голосов
/ 15 июля 2009

Да, я думаю, перегрузка должна работать нормально, хотя есть некоторые странные вещи, которые могут произойти из-за порядка, в котором параметры и шаблоны сопоставляются.

Просто для полноты вот как сделать исходный пример компиляции:

template<int A>
class Thing
{ // 5
...
template<int B>
Thing<A> &operator=(const Thing<A> &);
};

template<int A>
template<int B>
Thing<A> &Thing<A>::operator=(const Thing<A> &other) { // 23
    ...
2 голосов
/ 15 июля 2009

Не думаю, что вам нужно специализировать его, разве вы не можете просто предоставить перегрузку для operator=?

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);
        }

        Thing &operator=(const Thing &other) {
            printf("operator overload called");
            printf("this->data = %d\n", data);
        }

    private:
        int data;
};

IIRC есть некоторые ошибки поиска, если вы попытаетесь объединить перегрузки со специализациями, но здесь это не выглядит необходимым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...