为模板函数专门化一个模板类

Posted

技术标签:

【中文标题】为模板函数专门化一个模板类【英文标题】:specialize a template class for a template function 【发布时间】:2012-08-21 09:13:39 【问题描述】:

我有两个类似的模板类

template <class T>
class MyClass1;

template <class T>
class MyClass2;

我有一个模板函数使用它们作为参数。这些类专用于 std::string:

template <template class<std::string> T> myMethod(T<std::string>& arg)

我想使用 myMethod(objectOfMyClass1) 和 myMethod(objectOfMyClass2),但代码无法编译。如何?

【问题讨论】:

myMethod 被声明为没有参数,但您使用参数调用它? “不编译”是相当广泛的术语,不是吗? @Griwes 我确定这是由我的函数声明引起的。我不知道怎么写。 @MuQiao,为什么不把那个叫做error message的神奇东西贴在这里? 【参考方案1】:

首先,如果您的方法不带任何参数,您将无法随意调用它。

其次,MyClass1MyClass2 不是类,而是类模板——因此你不能拥有 objectOfMyClass1objectOfMyClass2

如果您的函数专门针对SomeClassTemplate&lt;std::string&gt; 形式的任何类型的参数,那么您所追求的是部分函数模板专业化,这在 C++ 中是不允许的。您将不得不使用部分专业化的类:

template <class T>
struct MyMethodCall;

template <template <typename> class T>
struct MyMethodCall<T<std::string> > 
  static void call(T<std::string> object) 
    ...
  
;

template <class T>
void myMethod(T & object) 
  MyMethodCall<T>::call(object);

【讨论】:

【参考方案2】:

这是一个可编译的示例

template <class T>
class MyClass1;

template <class T>
class MyClass2;

template <template <typename> class T> 
void myMethod(T<std::string>& arg)

int main()

MyClass1<std::string> c1;
myMethod(c1);
MyClass1<std::string> c2;
myMethod(c2);

【讨论】:

是的,代码现在可以编译。但是当我将函数定义移动到头文件时,它不会再次编译。 你能补充一下为什么我应该在那里使用 而不是真正的类型吗? @MuQiao:这是标准中定义的语法。 template &lt;typename&gt; class T告诉模板形参T是一个模板类,真正的模板形参由函数实参类型定义。

以上是关于为模板函数专门化一个模板类的主要内容,如果未能解决你的问题,请参考以下文章

C++中模板类成员函数的特化

专门化一个模板类?

C++模板,静态函数特化

成员函数指针值上的 Consexpr - 未定义的行为?

使用迭代器模板类作为函数的参数

类模板模板类函数模板模板函数