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?
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
@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? –
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