【发布时间】:2019-07-03 10:09:14
【问题描述】:
这是我拥有的静态/模板函数:
template<class T>
static T *createWidget(Vec pos, Module *module, ModuleWidget *moduleWidget, int paramId, float minValue, float maxValue, float defaultValue) {
T *widget = ParamWidget::create<T>(pos, module, paramId, minValue, maxValue, defaultValue);
moduleWidget->mRandomModeWidgets[paramId] = widget;
widget->Module = module;
widget->ModuleWidget = moduleWidget;
return widget;
}
但我想将声明放在.h 上,将定义放在.cpp 上。
试过了:
template<class T>
static T *createWidget(Vec pos, Module *module, ModuleWidget *moduleWidget, int paramId, float minValue, float maxValue, float defaultValue);
比:
template<class T>
static T *MyClasss:createWidget(Vec pos, Module *module, ModuleWidget *moduleWidget, int paramId, float minValue, float maxValue, float defaultValue) {
T *widget = ParamWidget::create<T>(pos, module, paramId, minValue, maxValue, defaultValue);
moduleWidget->mRandomModeWidgets[paramId] = widget;
widget->Module = module;
widget->ModuleWidget = moduleWidget;
return widget;
}
但它说此处可能未指定存储类。
我哪里错了?
【问题讨论】:
-
@YanB。所有定义都是声明。而且,模板也可以前向声明。
-
@eerorika 你说得对,我的意思是没有定义的声明,就像那些有普通函数的声明一样,它可以在与定义不同的文件中。术语...
-
@YanB。这就是前向声明,正如我所说;模板可以前向声明。
-
@YanB。那是错误的。
template<class T> struct X;和template<class T> void foo();分别是类和函数模板声明。在常见的用法中,在单独的文件中提供声明和定义可能没有意义,但这并不意味着这些概念不存在。您完全可以在.h中声明并在.cpp中定义模板,这在与显式模板实例化(以及其他一些特定场景)结合使用时非常实用。
标签: c++ templates compiler-errors static header