Какой компилятор правильный? 'template' перед шаблоном типа возвращаемого значения?

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

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

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

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

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


Изменить : победитель: g ++ / GCC (сюрприз-сюрприз ...).


template 
class A {
public:
    T t;
    K k;

    template 
    struct AttributeType{
    };

    template 
    AttributeType getAttr();

};

template 
template 
typename A::template AttributeType A::getAttr() {
//                ^^^^^^^^ -- needed or not?
    return t;
}


int main(){
    A a;
}

15
задан Community 23 May 2017 в 12:34
поделиться