0

Почему возникает ошибка компиляции неопределённая ссылка при реализации в .cpp файле шаблонного кода, объявленного в .h файле?

Например, есть три файла:

main.cpp

#include "TestClass.h"

int main() {

TestClass<char> testClass;
testClass.v();

}

TestClass.h

#ifndef FILTER_TESTCLASS_H
#define FILTER_TESTCLASS_H

#include <iostream>

template <typename T> class TestClass {

public:

void v();

};

#endif //FILTER_TESTCLASS_H

TestClass.cpp

#include "TestClass.h"

template <typename T> void TestClass<T>::v() { std::cout << "abc\n"; }

Компилятор говорит: неопределённая ссылка на «TestClass<char>::v()». Почему?

AvidCoder
  • 2,808
  • 1
    См. в ответе из дубля - "Неправильная реализация шаблонного кода.

    Например, реализация шаблонного кода помещена в .cpp файл, хотя она должна находиться полностью в подключаемом .h файле." И когда задаете вопросы, читайте описания меток - метка "шаблон" означает "шаблоны проектирования".

    – Harry Mar 05 '21 at 13:03
  • @Harry серьёзно? А почему существует такое требование? Из-за этого же пропадает смысл разделения кода на .h и .cpp файлы. Вообще, можно было бы дать более развёрнутый ответ, потому что в том ответе этой теме уделены две строчки. – AvidCoder Mar 05 '21 at 13:06
  • 1
    Чтобы рассказывать более подробно - вопрос должен быть задан иначе. А кратко - поставьте себя на место компилятора. Каждый .cpp компилируется отдельно, ничего не зная о других .cpp-файлах. Итак, какую TestClass<T>::v() - для какого T - вы будете инстанцировать? Еще раз - вы не знаете, что будет написано в main.cpp, для того и раздельная компиляция. – Harry Mar 05 '21 at 13:29
  • Я добавил разъяснение по вашей ситуации в соответствующем ответе – αλεχολυτ Mar 05 '21 at 18:08
  • @αλεχολυτ спасибо. – AvidCoder Mar 05 '21 at 18:23

0 Answers0