Ho il codice della seguente struttura (che è ovviamente molto più complessa in realtà, specialmente "Base" è un three-liner, ma ho provato a catturare l'essenza di esso):Una istruzione 'using' si compila con g ++, fallisce la compilazione con clang
template <class T>
class A {};
template <class T>
class B {
public:
B(){};
};
template <class T>
class C : public B<A<T>> {
public:
using Base = B<A<T>>;
using Base::B;
};
static const C<int> c{};
il codice compila bene con g ++ tramite
g++ -c test.cpp -std=c++11
Tuttavia, con clang ++ ricevo un messaggio di errore che non capisco
clang++ -c test.cpp -std=c++11
test.cpp:14:14: error: dependent using declaration resolved to type without 'typename' using Base::B;
C'è qualcosa di sbagliato nel mio codice o si tratta di un bug in clang?
Nota: quando si scrive using B<A<T>>::B;
, esso viene compilato correttamente con entrambi i compilatori, ma questa non è una soluzione reale al mio problema.
Edit: la versione 3.5.0 è clang, versione di gcc 4.9.2 è
Quando si utilizzano i costruttori ereditari, il nome 'using' indica il costruttore, non il tipo, quindi' typename' è sbagliato. Ad ogni modo, 'usando Base :: Base' dovrebbe funzionare - c'è una regola speciale nella ricerca del nome che la risolve con il costruttore. http://coliru.stacked-crooked.com/a/5e01aeb4d26b312e –
Grazie per la spiegazione. 'using Base :: Base' è una buona soluzione per il mio codice di produzione. Comunque, la domanda rimane se "usare Base :: B" è valido. Per me, la menzione sbagliata di 'typename' suggerisce che c'è qualcosa di sbagliato in clang.Non sono esperto in C++ comunque. –
Sì, sembra un bug clang. Non c'è alcun motivo per cui "usare B > :: B;' e "usare Base :: B;" dovrebbe essere trattato in modo diverso. –