Que compilador está certo? 'modelo' antes de ser necessário o tipo de retorno modelado?
Este snippet (Tirado deessa questã) compila bem com g ++ (como visto), desde que otemplate
antes que o tipo de retorno esteja lá. Por outro lado, o VC10 não compila esse código com o seguinte erro:
erro C2244: 'A :: getAttr': incapaz de corresponder a definição de função a uma declaração existente
Se eu remover otemplate
, VC10 está feliz, mas o g ++ grita este erro:
error: não-modelo 'AttributeType' usado como modelo
note: use 'A :: template AttributeType' para indicar que é um modelo
É novamente por causa da pesquisa de duas fases interrompida do VC ou qual é a causa? Qual compilador está aqui? Eu suspeito que o g ++ esteja correto, pois tenho uma vaga memória detemplate
sendo necessário aqui, como com orebind
modelo dentro dos alocadore
Edita: Temos um vencedor: g ++ / GCC (surpresa surpresa ...
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;
}