如何使用dllexport-ed类,它是从dll中的显式实例化模板派生而没有警告的?

问题描述 投票:1回答:1

所以我有一个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)...

c++ templates visual-c++ dll dllexport
1个回答
0
投票
代码中包含很多错误,可能是一些错别字,还有一些是代码遗漏的部分,依此类推。

您得到的警告是因为显式实例化的模板(parent<int>)在

some_other_dll_file

© www.soinside.com 2019 - 2024. All rights reserved.