为模板函数专门化一个模板类
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】:
首先,如果您的方法不带任何参数,您将无法随意调用它。
其次,MyClass1
和 MyClass2
不是类,而是类模板——因此你不能拥有 objectOfMyClass1
和 objectOfMyClass2
。
如果您的函数专门针对SomeClassTemplate<std::string>
形式的任何类型的参数,那么您所追求的是部分函数模板专业化,这在 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);
【讨论】:
是的,代码现在可以编译。但是当我将函数定义移动到头文件时,它不会再次编译。 你能补充一下为什么我应该在那里使用template <typename> class T
告诉模板形参T是一个模板类,真正的模板形参由函数实参类型定义。以上是关于为模板函数专门化一个模板类的主要内容,如果未能解决你的问题,请参考以下文章