![]() |
酒量小的滑板 · 如何始终允许从浏览器中的本地文件访问麦克风和 ...· 8 月前 · |
![]() |
潇洒的硬币 · Java一分钟之-Spring Boot ...· 10 月前 · |
![]() |
睿智的楼房 · PyQt 5信号与槽的几种高级玩法· 1 年前 · |
![]() |
小胡子的麦片 · oracle数据库想要建一个触发器来实现禁止 ...· 1 年前 · |
![]() |
坚强的稀饭 · SSIS包保存在哪里?· 2 年前 · |
发布于 2009-01-30 10:26:41
注意:没有必要将实现放在头文件中,请参阅此答案末尾的替代解决方案。
无论如何,代码失败的原因是,在实例化模板时,编译器使用给定的模板参数创建一个新类。例如:
template<typename T>
struct Foo
T bar;
void doSomething(T param) {/* do stuff using T */}
// somewhere in a .cpp
Foo<int> f;
当读取这一行时,编译器将创建一个新类(让我们称之为
FooInt
),它相当于以下内容:
struct FooInt
int bar;
void doSomething(int param) {/* do stuff using int */}
}
因此,编译器需要访问这些方法的实现,并使用模板参数(在本例中为
int
)实例化它们。如果这些实现不在标头中,它们将无法访问,因此编译器将无法实例化模板。
一个常见的解决方案是在头文件中写入模板声明,然后在实现文件(例如.tpp)中实现类,并在头的末尾包含这个实现文件。
Foo.h
template <typename T>
struct Foo
void doSomething(T param);
#include "Foo.tpp"
Foo.tpp
template <typename T>
void Foo<T>::doSomething(T param)
//implementation
}
这样,实现仍然与声明分离,但编译器可以访问。
替代解
另一种解决方案是将实现分开,并显式实例化所需的所有模板实例:
Foo.h
// no implementation
![]() |
酒量小的滑板 · 如何始终允许从浏览器中的本地文件访问麦克风和摄像头_在进行Selenium测试时,如何访问或关闭Chromedriver中的麦克风和摄像头弹出窗口?_如何允许网站访问CEFSharp WPF中的本地文 8 月前 |
![]() |
睿智的楼房 · PyQt 5信号与槽的几种高级玩法 1 年前 |
![]() |
坚强的稀饭 · SSIS包保存在哪里? 2 年前 |