我想以另一种方式仅为指针模板参数和其余参数类型定义成员函数。我尝试了以下代码:
#include <iostream>
template <class T, class W>
struct A
{
void foo();
};
template<class T, class W> void A<T*, W*>::foo(){ std::cout << "foo" << std::endl; }
int main(){ }
不清楚为什么它不起作用。我将指针模板参数按照它们在模板声明中指定的顺序放置。实际上是N4296::14.5.1/3 [temp.class]
:
模板参数列表后面的类模板名称 成员定义应按与该命令相同的顺序命名参数 一个在成员的模板参数列表中使用的。
那为什么代码不起作用?我把参数放在相同的顺序。
答案 0 :(得分:0)
您必须将整个结构定义为部分专业化,您不能只挑选和选择要专门化的个人成员
[temp.class.spec]
1 [...]在第一次使用类模板特化之前,应声明部分特化,该模板特化将利用部分特化作为每个翻译单元中的隐式或显式实例化的结果。发生;无需诊断。
#include <iostream>
template <class T, class W>
struct A
{
void foo();
};
template<class T, class W>
struct A<T*, W*>
{
void foo();
};
template<class T, class W> void A<T*, W*>::foo() { std::cout << "foo" << std::endl; }
int main() {}