从(部分)特化中调用类模板的静态函数

时间:2012-01-25 18:01:35

标签: c++ templates

有没有办法让这段代码按预期工作?

#include <iostream>
using namespace std;

template<typename T> class templated{
public:
    static void f(){
        cout<<"doing something generically"<<endl;
    }
};

template<> class templated<int>{
public:
    static void g(){
        cout<<"doing something else, but specific to int"<<endl;
        f();
    }
};

int main(){
    templated<int>::g();
}

G ++抱怨f未在范围内声明。我已经尝试了调用f()templated<int>::f(),在templated中放置一个虚拟声明,在类定义之外移动声明...)所有可能的变化,所有这些都失败了,所以我会在这里省略它们。

4 个答案:

答案 0 :(得分:2)

由于您没有使用模板参数类型,因此您可以在此特定情况下继承:

template<> class templated<int>: templated<void>{
public:
    static void g(){
        cout<<"doing something else, but specific to int"<<endl;
        f();
    }
};

答案 1 :(得分:1)

您的专业版本 <{1}}(此处没有“继承”)。

如果你想继承,你应该考虑将f()移到基类中。

答案 2 :(得分:1)

不,专业化与基本模板完全分开,不会“继承”任何内容。

也许你可以添加一个可以从任何地方调用的自由函数?

答案 3 :(得分:0)

你可以使用某种包装器,有些像这样:

    template<typename T>
    class templated_core
    {
      public:
        static void f()
        {
          cout<<"doing something generically"<<endl;
        }
    };

    template<typename T>
    class templated : public templated_core<T>
    {
    };

    template<>
    class templated<int> : public templated_core<int>
    {
      public:
        static void g()
        {
          cout<<"doing something else, but specific to int"<<endl;
          f();
        }
    };