Il seguente codice viene compilato con successo con clangore 3.5.0 e g ++ 4.9.0 (con -Wall -Wextra -pedantic-errors
bandiere) sotto C++03 (flag -std=C++03
), C++11 (flag -std=C++11
) e C++14 (flag -std=C++14
):Parola chiave extra typename nell'elenco dei parametri del modello: è valida o no?
namespace N
{
typedef int T;
enum E{};
}
template <typename N::T>
struct ST{};
template <typename N::E>
struct SE{};
int main()
{
}
E 'valida per aggiungere ulteriore typename
parola chiave prima di una dichiarazione di parametro modello non di tipo?
Si noti che il seguente codice non viene compilato (come C++03, C++11, e C++14 codice):
typedef int T;
enum E{};
template <typename T t>
struct ST{};
template <typename E e>
struct SE{};
int main()
{
}
Ma il successivo compila bene ancora una volta (C++03, C++11, e C++14) :
typedef int T;
enum E{};
template <typename ::T>
struct ST{};
template <typename ::E>
struct SE{};
int main()
{
}
Sospetto che 'typename N :: T' venga analizzato come parametro di tipo, non correlato al tipo effettivo' N :: T'. Il nome di questo è strano, comunque. – leemes
@dyp E cosa dovrebbe seguire dal tuo preventivo? – Constructor
@leemes Sì, lo penso anch'io. Ed è * molto * strano. – Constructor