1

g++ main.c f.c以下は g++-4.2.1 で動作します
g++ -O3 main.c f.cが、警告が表示されます

/usr/libexec/gcc/powerpc-apple-darwin8/4.2.1/ld: Undefined symbols:
int f<int>(int const*)
collect2: ld returned 1 exit status


// main.c
template <typename T>
int f( const T* A );

int main()
{
    int* A = new int[10];
    int ftemplate = f( A );
}


// f.c
template <typename T>
int f( const T* A )
{   return A[0];
}

int call_f()
{   int* A = new int[10];
    return f( A );  // ok here but not from main()
}

macosx 10.4.11 powerpc-apple-darwin8-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. ビルド 5564) では、 -O2動作しますが、-O3動作しません。
macosx 10.7.4 i686-apple-darwin11-llvm-g++-4.2 ( https://github.com/kennethreitz/osx-gcc-installerから) では、
プレーンなg++ *.c動作でg++ -O *.c同じld: Undefined symbolsエラーが発生します。
たぶんバグ g++ <-> 古い /usr/bin/ld ? 愚かなことをした可能性が高い...

誰か助けてくれますか、またはこれが Mac 以外で動作するかどうかを確認できますか? ありがとう !

4

1 に答える 1

1

関数呼び出しで使用する引数の関数テンプレートを明示的にインスタンス化しない限り、関数テンプレートの定義を呼び出し元に表示する必要があります。

これにはメインの呼び出しが含まれます。

コンパイラは、暗黙的な関数テンプレートのインスタンス化のためにエクスポートされた関数定義シンボルを発行するため、最適化されていないビルドでも機能する可能性があります。C++ 標準では、コンパイラがそれを省略することが許可されており、GCC は最適化されたビルドのためにここでそれを行います (おそらく、呼び出しをインライン化するだけで、定義シンボルは使用されなくなります)。

于 2012-11-20T20:08:59.077 に答える