visual studio run program para configurar compile compilar code c++ templates linkage

c++ - studio - Error de enlace usando plantillas



visual studio code c++ configuration (2)

Han pasado años desde que hice mucho C ++, pero creo que estás encontrando un problema de compilación por separado. Las plantillas se instancian en la compilación, sin vincular.

Por lo tanto, cuando realiza la llamada a foo (), realmente no está instanciando la plantilla en el sentido de que no se genera ningún código de función nuevo, solo está creando un símbolo que el vinculador debe resolver.

Sin embargo, cuando se compila el segundo archivo, solo tiene la plantilla y nunca se crea una instancia, por lo que no se genera ninguna versión de foo () que realmente trate con ints. Como resultado, cuando vincula todo junto, obtiene el error.

No estoy 100% seguro de qué hacer con esto, pero sospecho que necesitarás forzar una instanciación de foo () con entradas en ese segundo archivo (suponiendo que sea un C ++). Solo trabajé con plantillas de clases, no con plantillas de funciones, estoy seguro de que alguien aquí le dará el código exacto en unos pocos ...

Convertí una función en una plantilla y comencé a obtener este error. No debo entender una limitación de plantillas. ¿Puede alguien decirme por qué esto está roto?

Estoy recibiendo este error:

Undefined symbols: "bool foo<int>(int const&, int const&)", referenced from: _main in file1.o ld: symbol(s) not found

Cuando enlace el siguiente código. El código está simplificado, pero aún falla. El primer archivo contiene:

#include <iostream> template <class T> bool foo (const T&, const T&); int main () { int left = 1; int right = 2; if (foo <int> (left, right)) std::cout << "foo!" << std::endl; return 0; }

Y el segundo archivo contiene:

template <class T> bool foo (const T& left, const T& right) { return true; }


Por la razón que dio Uri, los métodos de plantilla generalmente se definen en el archivo de encabezado. Como el suyo es una función y no un método de una clase, explícitamente defina (en el archivo de encabezado que puede estar incluido en más de un archivo CPP) como estático o en línea.

Pon esto en tu foo.h

template<class T> inline bool foo (const T& left, const T& right) { return true; }

Pon esto en tu main.cpp

#include <iostream> #include "foo.h" int main () { int left = 1; int right = 2; if (foo <int> (left, right)) std::cout << "foo!" << std::endl; return 0; }

El código cpp ahora ve la declaración completa de la función de plantilla.

Aquí se enumeran otras soluciones: ¿Cómo puedo evitar los errores del enlazador con mis funciones de plantilla?