2012-02-20 5 views
13

Perché una classe non può avere un decltype nell'elenco ereditari? Per esempio, mi sarei aspettato il seguente codice per rendere A<B> ereditare da RType, ma con G ++ 4.6.1 (usando -std=c++0x) che non può essere compilato:Perché una classe non può ereditare dal risultato di 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; 
} 

E ha pronunciato la seguente uscita:

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 

L'uso di declval è solo per fornire un'istanza in cui è necessario utilizzare decltype, ma anche altri usi di decltype non riescono (ovvero senza declval).

+3

Hai provato gcc 4.7, clang o qualsiasi altro compilatore? gcc non è completamente compatibile con C++ 11 ... – PlasmaHH

+1

@PlasmaHH Attualmente sto provando a compilare clang ora (per altri motivi) ma con MSVC++ 2010 non funziona. –

risposta

19

è consentito:

10.1: "Un elenco di classi di base può essere specificato in una definizione di classe utilizzando la notazione:"

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

quindi credo che il compilatore ha bug

+0

Eclipse CDT lo segnala anche come errore di sintassi ma, in realtà, viene compilato. – WorldSEnder

3

A soluzione:

+0

Si noti che sto ereditando dal tipo che è il tipo di ritorno di una funzione. Questo non può/non può fare la stessa cosa. –

+3

@Seth: Penso che l'implicazione fosse provare 'template class A: public ID () .hello())> :: type {};'. – ildjarn

+0

@ildjarn probabilmente hai ragione, non ho pensato abbastanza in modo –

-2

Si potrebbe provare qualcosa come

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

sebbene possa aspettarsi una funzione membro statico per quella sintassi, ed è probabile che si imbatta nello stesso bug che impedisce a decltype di funzionare.

Problemi correlati