2011-07-28 14 views
1

ポイントISO C++ n3290から:実引数依存の名前探索:ここではセクション3.4.2、パラ4ISO C++ n3290からポイント:実引数依存の名前探索:

When considering an associated namespace, the lookup is the same as the lookup 
performed when the associated namespace is used as a qualifier (3.4.3.2) except 
that: 
— Any using-directives in the associated namespace are ignored. 
— Any namespace-scope friend functions or **friend function templates** declared 
    in associated classes are visible within their respective namespaces even if 
    they are not visible during an ordinary lookup (11.3). 
— All names except those of(possibly overloaded) functions and function 
    templates are ignored. 

と彼は付け加えた以前の2003 satndardと比較します3番目のポイント。 どのようにそれが可能か説明することができます... expalin例と....(過負荷)..

Andalso彼は2番目のポイントで彼は友人の関数のテンプレートを含むことを言った(私はnoraml calss友人の機能を知っている)..誰でもこのことを説明することができます。

答えて

2

私はルックアップが常にそのように機能していて、実際の変更よりもはっきりしているはずだと思います。私はそれが追加されたかどうか確信が持てません。これは、コンパイラがいくつかのコーナーケースで実際に異なっていたり、正しい実装が何であるか疑問に思っていました。

Ad point 2.関数fがクラスcの友人であると宣言できるように、関数テンプレートtがクラスcの友人であることを宣言することもできます。宣言はテンプレート引数を明示的に記述しているため、宣言は異なります。したがって、両方のケースが明示的に適用される必要があると感じました。

template <typename T> bool f(T); 
class c { 
    friend bool f<c>(c); // only particular instantiation is friend 
    template <typename T> friend bool f<T>(T); // all instantiations are friends 
} 

(もちろん、これは無制限の楽しみのためにテンプレートであるcと組み合わせることができます)。

Ad point 3.この節は、クラスfを含む名前空間nの中で関数fを探している場合、クラスfは考慮されないことを意味します(ただし、n :: fを書いた場合はクラスになります)。 「おそらくオーバーロードされている」とは必ずしもそこにいる必要はありません。関数は常にオーバーロードすることができ、すべての名前空間で見つかったすべてのオーバーロードは最終的なオーバーロード解決に含まれます。

namespace n { 
    class c { ... }; 
    class e { ... } f; 
} 

namespace o { 
    class d { ... }; 
    void f(c &, d &) { ... }; 
    void f(c &, d &, bool) { ... }; 
} 

namespace p { 
    f(c(), d()); 
} 

f(c(), d())の関連付けられた名前空間の両方noです。しかし、n::fは関数ではなく、(おそらくファンクタ)インスタンスなので、考慮されていません(古い文言はを考慮して許可されています)。 o::fがオーバーロードされていると、すべてのオーバーロードが考慮されます(fのすべての可能な意味を収集した後、引数が2つしかないため、3つの引数の変形は除外されます)。

関連する問題