This snippet (tomado de this question) compila bien con g ++ (como se ve), siempre que el template
antes de que el tipo de devolución esté allí. Por el contrario, VC10 no compila el código con el siguiente error:¿Qué compilador tiene razón? 'plantilla' antes del tipo de retorno de plantilla necesario?
error C2244: 'A::getAttr' : unable to match function definition to an existing declaration
Si quito el template
, VC10 es feliz, pero g ++ grita este error:
error: non-template 'AttributeType' used as template
note: use 'A::template AttributeType' to indicate that it is a template
¿También se debe de VC está roto búsqueda de dos fases o ¿cuál es la causa? ¿Qué compilador está aquí? Sospecho que g ++ es correcto, ya que tengo un vago recuerdo de template
que se necesita aquí, como con la plantilla rebind
dentro de los asignadores.
Editar: Tenemos un ganador: g ++/GCC (sorpresa, sorpresa ...).
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;
}
el código postal en la pregunta. Apoye los soportes de desbordamiento y lo alienta firmemente. –
En general, el "compilador de referencia" informal para el cumplimiento estándar es Comeau, puede intentar enviar su fragmento [aquí] (http://www.comeaucomputing.com/tryitout/) para ver su veredicto. - EDITAR: intentado ahora, el fragmento compila bien como está en Ideone. –
@Merlyn: Quería mantener esta pregunta corta, sin embargo. – Xeo