Какой компилятор прав? "шаблон" перед тем, как требуется шаблонный тип возврата?

Этот фрагмент (взятый из этот вопрос) компилируется отлично с g++ ( как видно), так долго template до типа возврата. Напротив, VC10 не компилирует этот код со следующей ошибкой:

ошибка C2244: "A:: getAttr": невозможно сопоставить определение функции с существующим объявлением

Если я удалю template, VC10 будет счастлив, но g++ закричит эту ошибку:

error: не шаблон "AttributeType", используемый как шаблон
note: используйте 'A:: template AttributeType', чтобы указать, что это шаблон

Повторяется ли это из-за неисправного двухфазного искажения VC или в чем причина? Какой компилятор здесь? Я подозреваю, что g++ корректен, так как мне нужна неопределенная память template, например, с шаблоном rebind внутри распределителей.


Изменить. У нас есть победитель: g++/GCC (неожиданное удивление...).


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>
typename A<T, K>::template AttributeType<i> A<T, K>::getAttr() {
//                ^^^^^^^^ -- needed or not?
    return t;
}


int main(){
    A<int,int> a;
}

Ответ 1

GCC прав. AttributeType - зависимое имя шаблона, за которым следует угловая скобка <, поэтому здесь требуется ключевое слово template, чтобы удалить неопределенность 1 давая понять компилятору, что то, что follow - имя шаблона. Правило упоминается в §14.2/4:

Когда имя шаблона участника специализация появляется после. или → в постфиксном выражении или после inested-name-specifier в квалифицированный идентификатор и постфиксное выражение или квалифицированный идентификатор явно зависит от шаблон-параметр (14.6.2), имя шаблона члена должно быть префиксом по шаблону ключевого слова. В противном случае предполагается, что имя без шаблона.

1 @Johannes написал очень хорошее объяснение здесь:

Где и почему мне нужно поставить "шаблон" ? и "typename" ключевые слова?