Этот фрагмент (взят из этот вопрос ) отлично компилируется с 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;
}