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