См. следующий код и, пожалуйста, очистите мои сомнения.
-
Поскольку ABC является шаблоном, почему он не показывает ошибку, когда мы помещаем определение функции члена класса ABC в test.cpp?
-
Если я поставлю код test.cpp в test.h и remes 2, то он отлично работает. Почему?
.
// 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
}