2014-09-19 14 views
10

GCC 4.8.1 accettaQual è la sintassi conforme standard per l'ereditarietà del costruttore di template?

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass<T>::Baseclass; 
}; 

ma MSVC non lo fa. D'altra parte, MSVC accetta

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass::Baseclass; 
}; 

ma GCC non lo fa. Poi ho visto un altro tipo di dichiarazione in questa domanda: c++11 inheriting template constructors

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass::Baseclass<T>; 
}; 

per i quali MSVC mette in guardia circa uno "stile dichiarazione obsolete" e GCC dice

prog.cpp:8:24: error: ‘template<class T> class Baseclass’ used without template parameters 
     using typename Baseclass::Baseclass<T>; 

ho pensato che il primo esempio sarebbe il sintassi conforme standard. Intuitivamente, sembra giusto per me.

Qual è la sintassi conforme allo standard C++ 11?

+3

Che versione MSVC? VS2013 non supporta i costruttori ereditari. AFAIK, il primo è la sintassi corretta. 'using Baseclass :: BaseClass ' dovrebbe funzionare per i casi in cui 'BaseClass' non è un modello di classe, ma ha un modello di costruttore. – Praetorian

+0

@Praetorian Ora è sorprendente. Ma ho sempre usato solo il costruttore di default e di copia, e ora dopo aver testato un costruttore diverso, vedo che hai ragione. I costruttori di copia e di default sono ereditati automaticamente? –

+1

Dovrai controllare lo standard, ma sono abbastanza sicuro che le funzioni dei membri speciali siano * mai * ereditate. Possono essere automaticamente dichiarati dal compilatore nella classe derivata seguendo le normali regole per la loro generazione. – Praetorian

risposta

2

La risposta è un po 'sepolta nello standard. Una dichiarazione using è definito come (7.3.3):

using [typename] nested-name-specifier unqualified-id; 

Il nested-name-specifier risolve dopo alcuni passaggi in simple-template-id che è definita come

template-name < [template-argument-list] > 

In breve, la sintassi conforme standard è

template <typename T> 
class Subclass : public Baseclass<T> 
{ 
public: 
    using typename Baseclass<T>::Baseclass; 
}; 
+0

Grazie mille! –

Problemi correlati