2012-02-20 5 views
13

¿Por qué una clase no puede tener un decltype en la lista de herencia? Por ejemplo, yo esperaría que el siguiente código para hacer A<B> Heredar del RType, pero con G ++ 4.6.1 (usando -std=c++0x) no compila:¿Por qué una clase no puede heredarse del resultado de un decltype?

#include <type_traits> 

template<typename T> 
class A : public decltype(std::declval<T>().hello()) { }; 

class RType { }; 

class B { 
public: 
    RType hello() { return RType(); } 
}; 

int main() { 
    A<B> a; 
} 

Se da el siguiente resultado:

test.cpp:6:18: error: expected class-name before 'decltype' 
test.cpp:6:18: error: expected '{' before 'decltype' 
test.cpp:6:54: error: expected unqualified-id before '{' token 
test.cpp: In function 'int main()': 
test.cpp:16:7: error: aggregate 'A<B> a' has incomplete type and cannot be defined 

El uso de declval es solo para proporcionar una instancia donde necesitó utilizar decltype, pero también fallan otros usos de decltype (es decir, sin declval).

+3

¿Has probado gcc 4.7, clang o algún otro compilador? gcc aún no es totalmente compatible con C++ 11 ... – PlasmaHH

+1

@PlasmaHH En realidad estoy tratando de compilar clang ahora (por otras razones) pero con MSVC++ 2010 no funciona. –

Respuesta

19

Está permitido:

10.1: "Una lista de clases base se puede especificar en una definición de clase usando la notación:"

class-or-decltype: 
nested-name-specifieropt class-name 
decltype-specifier 

así que supongo que el compilador tiene fallo

+0

Eclipse CDT también informa esto como un error de sintaxis pero, de hecho, se compila. – WorldSEnder

3

Un solución alternativa:

template <typename T> 
class ID 
{ 
public: 
    typedef T type; 
}; 

template<typename T> 
class A : public ID<whatever>::type { }; 
+0

Observe que estoy heredando del tipo que es el tipo de devolución de una función. Esto no/no puede hacer lo mismo. –

+3

@Seth: Creo que la implicación era probar 'template clase A: public ID () .hello())> :: type {};'. – ildjarn

+0

@ildjarn probablemente tenga razón, no pensó lo suficiente –

-2

Puede intentar algo como

template<typename T> 
class A : public result_of<T::hello()> 

pesar de que puede estar esperando una función miembro estática para que la sintaxis, y es probable que se encontraría con el mismo error que impide decltype de trabajo.

Cuestiones relacionadas