次のコードは、GCC 4.6 では受け入れられません。
void F(int x,char y)
{
}
template<typename T>
void G(T t)
{
F(t);
}
void F(int x)
{
}
int main()
{
G(5);
return 0;
}
それはすべきですか?
そうでない場合、誰かが回避策の良いアイデアを持っていますか? これが発生する現実世界のシナリオでは、G が特定の種類の問題を解決するためのライブラリの一部であり、F と呼ばれるユーザー提供のヘルパー関数が必要です。ただし、さまざまな種類の問題では、F はさまざまな数のパラメーターを受け取ります。ライブラリには、F のサンプル実装がいくつか付属しています。
何が起こっているかというと、クライアントが使用する #include-order によっては、テンプレート宣言時に F の「間違った種類」のみが表示される可能性があり、GCC はユーザーが提供する正しい F を待たずにあきらめます。が定義されています。これは、正しい F が定義された後にテンプレートのインスタンス化が行われるにもかかわらずです。
更新: はい、F のすべての宣言が G の前に発生する場合、または F のすべての宣言が G の後に発生する場合に機能することはわかっています。ただし、それはあまり役に立ちません。
更新: この最小限の例が適用されたコードでは、F は実際には「読み取り」と呼ばれます。read の最初の宣言は、2 番目の宣言とはまったく関係ありません。最初の宣言は 1 つのヘッダー ファイルにあり、2 番目の宣言は別のヘッダー ファイルにあります。特に「読み取り」のバージョンが互いに何の関係もない場合、インクルードファイルの順序に関して「奇妙な」ルールを導入したくありません。