2013-07-15 16 views
9

私がソースで持っていたコンパイルの問題の手がかりを探しているうちに、関数の参照に関連してこのbug report (against Mozilla's JavaScript engine source)が見つかりました。バグレポートからの引用:テンプレート関数からの静的関数参照の問題xlC

TypedArrayTemplateは(明らかに)テンプレートであり、それはで「::」を接頭語として使用せずにINT_TO_JSVAL、静的インライン関数を、参照しています。これはINT_TO_JSVALを解決できないため、xlCを中断します。標準では、テンプレート引数のコンテキストで非修飾名が見つからない場合、静的なものを考慮する必要はありません。 g ++はこのフォールバックを行いますが、xlCはそうしません。

コンパイラからの有益なメッセージ:私の場合は

(I) Static declarations are not considered for a function call if the function is not qualified. 

失敗したコードは、これに類似していた:

namespace N 
{ 

static bool foo (std::string const &); 

template <typename T> 
void bar (T const &, std::string const & s) 
{ 
    // expected unqualified call to N::foo() 
    foo (s); 
} 

void baz (std::string const & s) 
{ 
    bar (s); 
} 

} // namespace N 

はのxlCが本当に正しい実装振る舞いですか?これについて2003年か2011年の標準はどこで話していますか?

答えて

9

これは正しい動作です。テンプレートで使用される名前の修飾されていない名前解決は、外部リンケージを持つ関数のみを見つけるように定義されていました。

C++ 03のセクション14.6.4.2候補機能[temp.dep.candidate]段落1:

関数名が修飾されていない-IDである場合には、テンプレートパラメータに依存する関数呼び出しの場合しかしない テンプレート-ID、候補関数は通常の検索規則を使用して発見されたことを除いて(3.4.1、3.4.2):

  • 非修飾名の検索(3.4を使用して、ルックアップの部分について。 1)、外部からの関数宣言のみ テンプレートからのリンケージ定義文脈が見つかる。

  • 関連付けられた名前空間(3.4.2)を使用するルックアップの部分では、テンプレート定義コンテキストまたはテンプレートインスタンス化コンテキストのいずれかに外部 リンケージがある関数宣言のみが見つかります。

    C++ 11に変更

:テンプレートパラメータに依存する関数呼び出しの

、候補関数は、3.4.1(通常 ルックアップルールを使用して発見されます非修飾名の検索(3.4.1)または修飾名の検索(3.4.3)を使用して、ルックアップの一部については

  • 、唯一:ことを除いて、3.4.2、3.4.3)テンプレート定義コンテキストの関数宣言が見つかりました。

  • 関連付けられた名前空間(3.4.2)を使用するルックアップの部分では、 で見つかった関数宣言だけがテンプレート定義コンテキストまたはテンプレートインスタンス化コンテキストのいずれかにあります。コンパイラの

+0

の以前のバージョンを使用して、私はC++ 11は、外部リンケージの要件をドロップすることを正しく読んでくださいしている場合は? – wilx

+0

はい、正しいです。 – Casey

+0

この回答は要約を使用することができます。 –

4

V12.1は、デフォルトでは、新しい動作を持っています。

あなたはのxlCコンパイラの使用オプション-qdebug=KeepUnqualifiedStaticCandidate

関連する問題