reconoce programa para mundo interno hola externo dev compilar como comando c++ visual-c++ template-specialization class-template

c++ - programa - hola mundo en c



¿Debería compilarse el siguiente programa según el estándar? (2)

Después de mi descubrimiento de incosistency entre MSVC y GCC (probablemente también clang) en la compilación y la vinculación del mismo código, me he vuelto curioso si este programa realmente compila y vincula y por lo tanto es un error en MSVC (que informa un error del enlazador) o debería Lo escribo de manera diferente. El programa consta de 3 archivos:

Ch

template <typename T> struct A { void func() {}; }; template <> void A<int>::func ();

A.cpp:

#include "C.h" int main() { A<int> x; x.func(); }

B.cpp:

#include "C.h" template <> void A<int>::func() { }

El error de enlazador resultante de MSVC es:

A.obj: error LNK2019: símbolo externo no resuelto "public: void __thiscall A :: func (void)"

Entonces, básicamente, decide no crear un símbolo fuera de la definición colocada en B.cpp . Lo que me hace sospechar fuertemente que es un error es que mover la definición no especializada de func de la definición de estructura e incluso colocarla por encima de la declaración de especialización hace que el programa tenga éxito, pero me gustaría estar seguro.

Entonces mi pregunta es: ¿este programa debe ser compilado y enlazado sin errores por un compilador / enlazador conforme?


Del estándar:

© ISO / IEC N4527 14.6.4.1 Punto de instanciación [punto.Temperatura] 1 Para una especialización de plantilla de función, una especialización de plantilla de función miembro, o una especialización para una función miembro o miembro de datos estáticos de una plantilla de clase, si la especialización es implícita instanciado porque se hace referencia desde dentro de otra especialización de plantilla y el contexto del que se hace referencia depende de un parámetro de plantilla, el punto de instanciación de la especialización es el punto de instanciación de la especialización adjunta. De lo contrario, el punto de creación de instancias para dicha especialización sigue inmediatamente a la declaración o definición del alcance del espacio de nombres que se refiere a la especialización .

En este caso, creo que esto significa en Ch donde ocurre la "declaración de alcance". Si este es el caso, entonces su código debe vincularse con una cadena de herramientas estándar compatible. Podría estar malinterpretando esto ...


Los espacios de nombres sin nombre tienen un enlace interno. Como la especialización de la plantilla se encuentra dentro de un espacio de nombre sin nombre, también tiene un vínculo interno.

Para resolver el problema, coloque la plantilla en un espacio de nombre nombrado o especifique la especialización como ''extern''.