Es sieht aus wie Compiler akzeptieren unterschiedliche Syntax zur Initialisierung von statischen in Vorlage.Template-Spezialisierung statische Initialisierung ICC + Vc vs GCC + Clang
template <typename T> struct TBase
{
static const int i;
static const int j;
};
// compile: gcc + clang + visual + icc
template <> const int TBase<double>::i=1;
// compile: vc + icc
// failed gcc, gcc -fpermissive, clang
const int TBase<double>::j=2;
Ist die Syntax ohne template<>
von der Norm akzeptiert, auch wenn es im Moment offensichtlich nicht tragbar ist?
bearbeiten: Mit diesem Code auf VC++ TBase<double>::i==1
und TBase<double>::j==2
genau wie der Code ohne Vorlage.
struct noTemplate
{
static const int i;
static const int j;
};
const int noTemplate::i=1;
const int noTemplate::j=2;
gcc und Klirren scheint die Verwendung von template<>
zur Durchsetzung dieser statisch zu initialisieren, ich sehe nicht, warum Compiler diese Informationen benötigen.
Danke. Implizite Instanziierung ist also für die lokale Verwendung von Vorlagen, explizite Instanziierung für den Export von Vorlagen wie in lib. Mit vC++ die Template Deklaration und Initialisierung eines Wertes wie int const X :: j = 3; ist genug für Code (x ()). j zu sein "gültig" scheint ein bisschen seltsam. –
ColdCat