En ambos casos, está realizando una instanciación explícita. En el segundo caso, solo se está creando una instancia de ABC<char>::foo
, mientras que en el primer caso también se está instanciando ABC<char>::bar
.
A diferente ejemplo similar puede aclarar las implicaciones:
// test.h
template <typename T>
class ABC {
public:
void foo(T&);
void bar(T&);
};
// test.cpp
template <typename T>
void ABC<T>::foo(T&) {} // definition
template <typename T>
void ABC<T>::bar(T&) {} // definition
template void ABC<char>::foo(char &); // 1
template class ABC<char>; // 2
// main.cpp
#include "test.h"
int main() {
ABC<char> a;
a.foo(); // valid with 1 or 2
a.bar(); // link error if only 1, valid with 2
}
En el ejemplo, en main
el compilador no puede ver foo
ni bar
definiciones, lo que no puede instanciar los métodos. El compilador, al procesar main.cpp aceptará el código en main con mucho gusto, ya que le está diciendo que ABC
es una plantilla y que tiene esas dos funciones, y asumirá que se definirán en alguna otra unidad de traducción.
En la unidad de traducción que contiene test.cpp el compilador está viendo ambas definiciones de métodos, y las dos instancias (método/clase) se pueden procesar por completo. Si solo está presente la instanciación del método ([1]), el compilador solo generará ese método, y dejará bar
indefinido. Por lo tanto, cualquier código que incluya test.h, enlaces contra el test.cpp compilado y solo utilice el método foo
compilará y vinculará, pero el uso de bar
no podrá enlazarse debido a que no está definido.
La instanciación explícita de la plantilla de clase genera los símbolos para todos los métodos de miembro, y en ese caso, cualquier unidad de traducción que incluya test.h y enlaces contra el archivo de objeto test.cpp compilado compilarán y vincularán.
¿Por qué lo preguntas? Son dos declaraciones bastante diferentes. –
@Dennis Zickefoose: todos eran principiantes en algún momento – ereOn
@ereOn: Sí, pero ¿por qué le está pidiendo puede recorrer un largo camino hacia lo que sugiere un enfoque adecuado para tomar al responder a la pregunta. –