вызов статической функции шаблона класса из его (частичной) специализации - PullRequest
1 голос
/ 25 января 2012

Есть ли способ заставить этот код работать как задумано?

#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 ]

2 голосов
/ 25 января 2012

Вы можете наследовать в этом конкретном случае, так как вы не используете тип аргумента шаблона:

template<> class templated<int>: templated<void>{
public:
    static void g(){
        cout<<"doing something else, but specific to int"<<endl;
        f();
    }
};
1 голос
/ 25 января 2012

Нет, специализация полностью отделена от базового шаблона и ничего не "наследует" от него.

Возможно, вы можете добавить бесплатную функцию, которую можно вызывать из любого места?

1 голос
/ 25 января 2012

Ваша специализированная версия просто не имеет и f() (здесь нет "наследования").

Если вы хотите наследования, вам, вероятно, следует рассмотреть возможность перевода f() в базовый класс.

0 голосов
/ 04 августа 2012

Вы можете использовать какую-нибудь оболочку, например, такую:

    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();
        }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...