Итак, у меня есть dll, которая экспортирует класс, который получен из явно созданного (также экспортированного) шаблона.
parent.hpp
#pragma once
template <typename T>
struct parent {
parent(T t) m_t(t) {};
void print();
T m_t;
};
parent. cpp
template<typename T>
void parent<T>::print() {
cout << m_t << endl;
}
template class LIB_API parent<int>;
child.hpp
#include "parent.hpp"
extern template class parent<int>;
struct LIB_API child : public parent<int> {
using parent<int>::parent;
void some_method();
}
child. cpp определяет some_method
Пока все отлично и работает. Я могу безопасно использовать дочерний класс из целей, которые связаны с DLL. Проблема возникает, когда я использую child
класс в самой dll в другом модуле компиляции:
some_other_dll_file. cpp:
void func()
{
child c(53);
c.print();
c.some_method();
}
В этом случае я получаю предупреждение: warning C4661: 'void parent<int>::print(void)': no suitable definition provided for explicit template instantiation request
(или в моем конкретном случае тонна предупреждений для каждого метода, который не отображается в заголовке шаблона в каждом файле в DLL, которая использует дочерний класс)
Обратите внимание, что это только предупреждение. В конце концов все компилируется и связывается, и работает нормально.
Есть ли способ изменить код, чтобы я не получил это предупреждение?