C ++ специальный экземпляр функции шаблона для некоторого типа, который сам является классом шаблона - PullRequest
1 голос
/ 10 января 2010

У меня возникли проблемы при создании специального экземпляра функции-члена класса, не являющегося шаблоном. У меня есть, например, класс A с функцией-членом шаблона F:

class A
   {public:
      template <class T> int F (T arg) const;
      ....
   }

и хотите иметь специальный экземпляр этой функции-шаблона F для типа B:

class B;
...
template <> void A::F (B arg) const //GOOD!

и работает отлично, пока не появится, что B сам шаблон!

Этот код

template <class T> class B ...
...
template <> void A::F (B<T> arg) const //error, T undeclared

а также

template <class T> class B ...
...
template <class T> template <> void A::F (B<T> arg) const //error, too many templates

выдает ошибку компиляции.

Вторая проблема в том, как объявить этот специальный экземпляр (или экземпляр шаблона в целом) функцией-другом класса B? (Is не работает, даже если B не шаблон).

class B
   {friend template <> void A::F (B arg) const // error
     // as well as
    template <> friend void A::F (B arg) const // error
   }

Есть ли способ написать код так, как я собираюсь, или это невозможно?

1 Ответ

0 голосов
/ 10 января 2010

Вы пытаетесь создать частичную специализацию для шаблона функции, что недопустимо. То, что вы можете сделать, это просто создать перегрузку.

Чтобы создать друга, вам просто нужно использовать правильный синтаксис.

Следующие компиляции без ошибок.

template <typename T>
struct B {};

struct A
{
    template <typename T>
    void F(T arg) const;

    template <typename T>
    void F(B<T> arg) const;

    template <typename T>
    friend void G(B<T> arg);

    template <typename T>
    friend struct B;
};
...