Шаблон спагетти - PullRequest
       9

Шаблон спагетти

5 голосов
/ 04 июня 2011

Пожалуйста, пролите свет на этот непонятный кусок спагетти с шаблоном:

template <typename T, typename K> class A {
public:
    T t;
    K k;

    template <int i, int unused = 0> struct AttributeType {
    };

    template <int i> AttributeType<i> getAttr();

};

template <typename T, typename K> template <int i> A<T, K>::AttributeType<i> A<T, K>::getAttr<i>() {
    return t;
}

Я не могу придумать правильный синтаксис для определения реализации A::getAttr(). Текущий код не компилируется в строке определения getAttr:

error: function template partial specialization ‘getAttr<i>’ is not allowed

Как мне перефразировать определение функции?

1 Ответ

7 голосов
/ 04 июня 2011

Удалите это <i> после имени функции и добавьте typename прямо перед типом возврата, это зависимое имя . Кроме того, отсутствует template до AttributeType, потому что это шаблон:

template <typename T, typename K>
template <int i>
typename A<T, K>::template AttributeType<i> A<T, K>::getAttr() {
    return t;
}

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

Кроме того, функция выглядит неправильно, или AttributeType имеет конструктор преобразования из T?

...