所以我有一个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,用于导出从显式实例化(也已导出)的模板派生的类。 parent.hpp #pragma一次模板
struct parent {parent(T t)m_t(t)...
您得到的警告是因为显式实例化的模板(parent<int>
)在
some_other_dll_file