3

これは、私が信じているC++標準に従って機能するはずの簡単なコードです。

template<typename T> 
void foo(T x) 
{ 
    bar(x); 
    void bar(int);
} 
 
void bar(int)  { } 
 
int main() 
{ 
    foo(0); 
} 

エラーはGCC 4.7から次のようになります。

'bar' はこのスコープで宣言されておらず、インスタンス化の時点で引数依存ルックアップによって宣言が見つかりませんでした

しかし、C++ 標準ではそれが書かれています。§ 14.6.4.2 :

テンプレート パラメーターに依存する関数呼び出しの場合、次の点を除いて、通常の検索規則 (3.4.1、3.4.2、3.4.3) を使用して候補関数が検索されます。

— 非修飾名ルックアップ (3.4.1)または修飾名ルックアップ (3.4.3)を使用したルックアップの部分では、テンプレート定義コンテキストからの関数宣言のみが検出されます。

書かれている内容について間違った印象を持っているかもしれませんが、ここで訂正してもらえますか?

4

1 に答える 1

0

「bar」の宣言を一番上に移動するだけです。テンプレートが定義されている (インスタンス化されていない) 時点では、'bar' が呼び出される前に宣言されていないためです。

于 2013-02-09T12:17:39.153 に答える