5

これは、概念を理解するために私が書いたコードです。コードは問題なく、実行されます。

私が理解していないのは、なぜマークされた行が必要なのですか?

template <class T>
class D
{
    public :
    template <class P>  //<------------------Why is this needed ? --------------
    friend void print(D <P> obj);
};

template <class T>
void print(D<T> obj)
{std::cout<<sizeof(T);};


int main()
{
    D <char>obj3;
    print(obj3);
    return 0;
}

または言い換えれば、なぜ以下が実行されないのですか?

template <class T>
class D
{
    public :
    friend void print(D <T> obj);
};
4

1 に答える 1

7

[temp.friend] に従って、テンプレート関数の特殊化をフレンドにするには、明示的なテンプレート引数を提供する必要があります。

template <class T>
class D
{
    public :
    friend void print<T>(D <T> obj);
};

print()これがないと、コンパイラは関数テンプレートではなく関数を探しprint()ます。

于 2012-11-19T10:33:29.073 に答える