首页 > 解决方案 > 如何在部分特化模板类中实现全特化模板成员函数

问题描述

假设我有一个带有两个模板参数和一个模板成员函数的模板类 Foo。

我想在模板类为部分特化时进行成员函数特化,但以下代码编译失败由 g++


    template <typename A, typename B>
    class Foo 
    {
    public:
        template<typename C> void bar();
    };
    
    template<> template<typename T> inline void Foo<T, int>::bar<float>() {
    }
    
    int main()
    {
        Foo<double, int> foo;
        foo.bar<float>();
    
        return 0;
    
    }

g++ 说:

错误:“<”之前的预期初始化程序 令牌

模板<> 模板内联 void Foo<T, int>::bar() {

我试过了

template<typename T> template<> inline void Foo<T, int>::bar<float>() {

和 g++ 抱怨更多

有可能吗?如何实现?

标签: c++templates

解决方案


当您专业化您的课程模板时,您将获得一个完全独立的专业化课程。因此,您必须使用其中的函数编写您的类 spezialisation foo

例子:

template <typename A, typename B>
class Foo 
{
    public:
        template<typename C> void bar() { std::cout << "Generic" << std::endl;}
};

template <typename T>
class Foo<T,int>
{
    public:
        template<typename C> void bar(){ std::cout << "spezialized" << std::endl; }

};

int main()
{
    Foo<double, int> foo;
    foo.bar<float>();

    Foo<double, char> foo2;
    foo2.bar<int>();

    return 0;

}

我相信你会尝试做一些不同的事情:-)

如果您只想在特定专业化中对成员进行专业化,而在非专业化情况下您希望查看类模板的通用功能,您可以这样做:

例子:

class Base
{
    public:
    template<typename C> void bar() { std::cout << "Generic" << std::endl;}
    void other() { std::cout << "Other" << std::endl; }
};

template <typename A, typename B>
class Foo: public Base
{
};

template <typename T>
class Foo<T,int>: public Base
{
    public:
        template<typename C> void bar(){ std::cout << "spezialized" << std::endl; }

};

int main()
{
    Foo<double, int> foo;
    foo.bar<float>();
    foo.other();

    Foo<double, char> foo2;
    foo2.bar<int>();
    foo2.other();

    return 0;
}

推荐阅读