如何为非类型模板类的专用化定义声明之外的方法
How do I define methods outside of the declaration for my specialization of a non-type template class?
标题很拗口,但基本上我写了这样的东西:
enum EnumType{ValA, ValB};
template<EnumType> class A {};
template<>
class A<ValA>
{
private:
double param;
public:
A(double param);
};
template<>
A<ValA>::A(double param)
{
// Do Stuff
}
当我尝试编译它时,我得到:
错误:模板 ID "A<>"表示"A<(EnumType(0u>::A(double("没有 匹配任何模板声明
我做错了吗?
在网上搜索类似案例后,我试图删除template<>
(即使我不明白为什么这会起作用(,但后来我得到了
'A<(EnumType(0u>::A(double(' 的多重定义
我想我可以用inline
替换template<>
(我尝试过并且它编译(,但这感觉不像是正确的方法(或者如果是,我不明白为什么(。
有人可以向我解释我写的东西有什么问题,为什么改变它似乎有效,以及正确的方法是什么?
有人可以向我解释我写的东西有什么问题,为什么改变它似乎有效,以及正确的方法是什么?
该标准说:
显式专用类模板的成员的定义方式与普通类的成员相同,并且不使用模板<>语法。
因此,在您的情况下,您必须使用:
A<EnumType::ValA>::A(double param)
{
// Do Stuff
}
完全没有template<>
就好了。这是因为您实际上是在专门化显式专用类模板的(特殊(成员函数(构造函数(。
在科利鲁上看到它。
如果没有明确的专业化,情况会有所不同。
作为一个最小的工作示例:
enum EnumType{ValA, ValB};
template<EnumType> class A
{
private:
double param;
public:
A(double param);
};
template<>
A<EnumType::ValA>::A(double)
{
// Do Stuff
}
int main() {
A<EnumType::ValA> a{0.};
}
在这种情况下,在定义构造函数之前需要template<>
,因为您没有定义已专用类模板的成员函数的专用化。
您错过了一个分号 (;)在类定义的末尾。非模板成员函数可以这样定义:
A<ValA>::A(double param) {
// Do Stuff
}
非正式地,模板参数列表只在必要时编写,例如,对于定义类模板的成员函数模板,两个模板参数列表应该全部写入
template<class U, class V>
class A{
template <class T>
A();
};
template<class U, class V>
template <class T>
A<U, V>::A() {}
并且需要一个空的模板参数列表来显式专业化函数模板(我想,这就是您在此处使用它的原因(,非正式地因为它告诉编译器这不是函数重载。
相关文章:
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- C++模板专用化 - 无法匹配函数定义
- 如何使用 STL 排序对具有模板专用化的自定义类对象进行排序?
- 为什么模板专用化需要内联定义?
- 模板专用化会导致未定义的引用错误
- 对专用模板成员的未定义引用
- 在模板类内部定义的枚举上的嵌套类的部分专用化
- 没有针对完全专用模板类的外联虚拟方法定义
- 使用模板模板参数进行模板定义的函数专用化
- 如何从具有专用化的类模板定义静态成员变量?
- 如何为模板化类的模板化函数定义模板专用化
- C++模板专用化成员函数的定义
- 仅为某些模板专用化定义转换运算符:预期类型/预期类型说明符
- 如何在另一个类模板中定义完全专用类的构造函数
- C++跨文件共享的模板专用化定义
- 如何专用/分配自定义内存位置,以便可以在C 中编辑该位置
- 元组的定义和初始化,其组件属于同一模板化类,但具有不同的专用化
- 在子类中定义可变参数函数专用化
- 为类模板的单个成员定义专用化
- UE4自定义专用服务器(碰撞,命中框)