部分类专业化中模板方法的专业化

时间:2012-02-10 18:21:18

标签: c++ templates

有这段代码:

#include <iostream>
#include <string>
#include <typeinfo>

// template class
template <class U, class X, class T>
class Klasa{
public:   
    template <class Z>
    void Method(){
    }
};

// partial class specialization
template <class U>
class Klasa<U, int, U>
{
public: 
    // template method
    template <class Z>
    void Method(){
    }
};

// error occurs for that!
template <class U>
template <>
void Klasa<U, int, U>::Method<int>(){
}

int main() 
{ 
    Klasa<float, int, float> object;
    object.Method<float>();
    return 0;
} 

编译错误:

error: invalid explicit specialization before ‘>’ token
error: enclosing class templates are not explicitly specialized
error: template-id ‘Method<int>’ for ‘void Klasa<U, int, U>::Method()’ does not match any template declaration

我尝试为方法

做专门化
void Klasa<U, int, U>::Method<int>

,但编译器不接受它。如何为这种方法编写专业化?

2 个答案:

答案 0 :(得分:1)

我理解,对于你想要“专门化”的Klasa< U, X, T >的每个部分特化(重载,真的,没有函数(编辑:部分)专门化(编辑:你,实际上,你试图实现))类型Method()只需X一次。这是代码(ideone link),看看这是否是你需要的。此外,您可能真的想要考虑一些有助于消除重复的特征类(我假设Method()对于所有通用Klasa< U, X, T>都是相同的,并且您需要为类型{的特定特化提供其他实现{1}})。编辑:也许,我应该提一下,尝试使用X时会出现编译错误。假设该类用户理解他需要致电Method< int >()以获得Klasa< U, X, T >::Method()的{​​{1}}“专业化”。

X

节目输出:

Method< Z >()

答案 1 :(得分:0)

请不要问我确切的报价,但根据David Vandevoorde的说法,这是无法做到的。理由是,这基本上是函数模板的部分特化,并且没有这样的东西。不允许这样做的一个原因是,如果该类有进一步的特化,则不清楚该专业化会发生什么:是继承的函数特化还是不继承?

显然,说不能做到这一点并不是很有帮助的。可以做些什么呢?一种简单的方法是将实现委托给一个重载的私有实现,该实现需要例如一个指针参数,用于消除各种类型之间的歧义。我意识到,重点可能是避免使用额外的参数,即使它仅在内部使用。另一种可能的方法是使用完全专用的基类:可以明确专门化其成员函数模板。