2013-05-06 7 views
5

VS10とarmcc4.1 [Build 561]の両方で次のコードのコンパイルをテストしました。 depth1()とdepth2()の両方の関数がVS上でコンパイルされますが、arm2はdepth1()をコンパイルし、depth2()に対してError 304(引数リストに一致するインスタンスはありません) fooとbarが非静的である場合、armccも同様にコンパイルされます。C++静的テンプレート関数によりarmccコンパイルエラーが発生する(304)

私はその理由を理解しています。

template <class T> 
static T foo(T arg) 
{ 
    return arg*5; 
} 

template <class T> 
static T bar(T arg) 
{ 
    return foo<T>(arg); 
} 

void depth2() 
{ 
    int i = 12; 
    i = bar<int>(i); 
} 

void depth1() 
{ 
    int i = 12; 
    i = foo<int>(i); 
} 
+1

はコンパイラのバグのように見えます。 arm-eabi-gccもうまく動作します。たぶんfooと関係するものは、バーをコンパイルしようとする前に存在しません Andres

+0

ありがとう@Andres。エラーメッセージ。から、これが当てはまると思われます。しかし、なぜ 'bar'がコンパイルするのか' foo'はコンパイルされないのかは不明です。おそらく、必要なテンプレートの深さと関係しているでしょう。 – levengli

+0

最初にdepth1()、次にdepth2()を定義するか、foo を明示的にインスタンス化してみてください。はい、コンパイラのバグです。ここでは回避策を提供しています。 –

答えて

3

これは、armcc 4.1のバグです。

雇用者がARMとのサポート契約を結んでいる場合は、http://www.arm.com/support/obtaining-support/index.phpでARMとのサポート問題を提起することができます(「開発ツール」タブをクリックして大きな青い「サポートケースを作成する」ボタンをクリックします)。

の回避策として、あなたはfooとソースファイル内のbarの定義を再配置

  • を試してみてください。および/または
  • fooおよび/またはbarの定義の前のどこかに前方宣言を提供する。および/または
  • は次のように、どこかにその宣言の後foo<int>の明示的なインスタンスを追加:

    template int foo(int arg); 
    // or, if you like this style better, 
    template int foo<int>(int arg); 
    
+0

あなたはテンプレートの後に<>を見つけられませんでしたか? 'template <> int foo (int arg);'さらに、 'template <> int foo(int arg);' – Kobi

+1

@Kobi:いいえ。 'template <>'は完全な専門化の構文です。 'template'は明示的なインスタンス化の構文です。これは実際にここで必要なものです。恥知らずのプラグイン:https://www.youtube.com/watch?v=vwrXHznaYLA – Quuxplusone

関連する問題