2013-05-15 7 views
14

C++標準では、部分的な特殊化のフレンド宣言が禁止されています。 (§14.5.3/ 8):標準では、部分的なスペシャライゼーションのフレンド宣言を禁止するのはなぜですか?

フレンド宣言は部分的なスペシャライゼーションを宣言してはならない。 [例:

template<class T> class A { }; 
class X { 
    template <class T> friend class A<T*>; //error 
}; 

--end例]

他の質問、例えばthis one、 はこの禁止を呼び起こす回答を受けましたが、 の根拠を知りたいと思います。私はそれを見ないし、私のお気に入りの検索エンジンでそれを見つけることができません。私は しかし、それはすぐに戻ってC++ 98標準に行くので、おそらく の根拠はかなり基本的かつ明確です。誰かが私にそれを説明することはできますか?ここで

+3

これはどのように「建設的ではないのですか? –

+0

@LuchianGrigore:おおまかな推測:考えられることを尋ねるのは – PlasmaHH

+1

@PlasmaHH実際に理由を知っている人(ほとんどの質問のように)から回答されない限り:) –

答えて

0

は、いくつかのundirect説明です: http://www.cprogramming.com/tutorial/template_specialization.html

最終的な実装の詳細は、部分的な特殊化を思い付く: どのようにコンパイラが完全にジェネリック型の 組み合わせがある場合は、使用する専門選ぶん、いくつかの部分的な専門化、 、多分いくつかの完全な専門化?最も一般的なルールは です。コンパイラは最も具体的なテンプレートを選択します 特殊化 - もっとも特定のテンプレートの特殊化は、テンプレートの引数が他のテンプレートの 宣言で受け入れられますが、すべての可能な引数を受け入れない です同じ名前の 他のテンプレートも受け入れます。

私は、専門化タイプの決定においてあいまいさを防ぐことは許されないかもしれないと推論する。

+0

あなたは、(許可されていれば)専門性があいまいですか? – David

+0

@faith_k、あなたの答えをありがとうが、それは投機的です。確かな答えとそれを知っている人がいなければならないので、私は諦めます。 –

+0

私はこれを全く買わない。解決ルールは複雑かもしれませんが、依然として特定のケースを決定します。また、一般的な「友人テンプレート」指定子は、実際にすべてのスペシャライゼーションを友人にもします。部分専門化の友人指定子が、指定されたパターンに一致するすべての特殊化(インスタンス化を含む)に単純に適用できないのはなぜですか? – davmac

1

私は参照を持っていませんが、これは、問題のテンプレートのスコープではなく、友人宣言クラスのスコープで部分的な特殊化が宣言され、専門家が正しい範囲に入るように友人宣言を強制するルールがたくさんあると、彼らはそれを単に禁止します。

+0

あなたの答えをありがとうが、それは投機的です。確かな答えとそれを知っている人がいなければならないので、私は諦めます。 –

関連する問題