1

非テンプレートクラスのメンバーテンプレート関数の特殊インスタンスを作成するのに問題がありました。たとえば、テンプレートメンバー関数Fを持つクラスAがあります。

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

タイプBのこのテンプレート関数Fの特別なインスタンスが必要です。

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

コンパイルエラーが発生します。

2番目の問題は、この特別なインスタンス(またはテンプレートインスタンス全体)をクラスBのフレンド関数として宣言する方法です。(Bがテンプレートでなくても機能しません)。

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

私がやろうとしている方法でコードを書く方法はありますか、それとも不可能ですか?

4

1 に答える 1

0

関数テンプレートの部分的な特殊化を作成しようとしていますが、これは違法です。できることは、単にオーバーロードを作成することです。

友達を作成するには、正しい構文を使用するだけです。

以下はエラーなしでコンパイルされます。

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;
};
于 2010-01-10T16:29:54.790 に答える