【问题标题】:Template specialization of a single method from templated class with multiple template parameters具有多个模板参数的模板类中的单个方法的模板特化
【发布时间】:2013-05-27 19:18:54
【问题描述】:

我基本上是在尝试做Template specialization of a single method from a templated class 中讨论的事情,只是我的 TClass 有多个模板参数,如下所示:

template < class KEY, class TYPE >
class TClass
{
public:
    :
    void doSomething(KEY * v);
    :
};

template < class KEY, class TYPE >
void TClass<KEY, TYPE>::doSomething(KEY * v) 
{
    // do something
}

到目前为止,这可行,但是如何为一个模板参数定义专门的实现?我试着添加这个:

template < class TYPE >
void TClass<int, TYPE>::doSomething(int * v)
{
    // do something if KEY is int
}

但编译器抱怨该方法/函数的“无法将函数定义与现有声明匹配”(VC2010)。

作为旁注:如果我同时专门化两个模板参数,它会起作用:

template < >
void TClass<int, char>::doSomething(int * v)
{
    // do something if KEY is int and TYPE is char
}

但这不是我想做的。

有什么建议吗?

【问题讨论】:

  • 顺便说一句,来自 VS2015 的错误消息可能非常无用。 C3860:模板参数顺序错误,C2995:模板已定义。

标签: c++ visual-studio-2010 templates specialization


【解决方案1】:

在通过部分特化定义方法之前,您必须特化整个类:

template <typename T, typename U>
class TClass;

template <typename T>
class TClass<int, T>
{
    void doSomething(int* v);
};

template <typename T>
void TClass<int, T>::doSomething(int* v)
{
    // ...
}

Live demo

【讨论】:

    【解决方案2】:

    你可以完全特化类方法,但据我记得你不能部分特化它。

    您可以尝试对整个班级进行部分专业化,但这可能会涉及大量重复。

    【讨论】:

    • 您的两个答案基本上都是一样的。我标记了 0x499602D2 的答案,因为它更详细。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2018-06-25
    • 2010-12-15
    • 2011-06-10
    • 1970-01-01
    • 2011-12-14
    • 2011-05-10
    相关资源
    最近更新 更多