2016-06-27 16 views
2

another questionを理解しようとしているので、次のコードを取得することでこの例を単純化しました。テンプレート化されたクラスのテンプレート化されたメソッドの特殊化のためのclang ++自動復帰型エラー?

template <bool> 
struct foo 
{ 
    template <typename T> 
     auto bar (int i) 
     { return i; } 
}; 

template <> 
template <typename T> 
    auto foo<true>::bar (int i) 
    { return i; } 

int main() 
{ 
    return 0; 
} 

g ++ 4.9.2問題なくコンパイルできます。打ち鳴らす++ 3.5 intと値を返す2 autoのいずれかを代入する次のエラーを

tmp_003-14,gcc,clang.cpp:12:20: error: out-of-line definition of 'bar' does not 
     match any declaration in 'foo<true>' 
    auto foo<true>::bar (int i) 
        ^~~ 

を与える、変更はありません:G ++コンパイルエラーを与える++打ち鳴らします。 autointに置き換えると、エラーは表示されなくなります。次のコードは、

template <bool> 
struct foo 
{ 
     auto bar (int i) 
     { return i; } 
}; 

template <> 
    auto foo<true>::bar (int i) 
    { return i; } 

int main() 
{ 
    return 0; 
} 

両方のコンパイラで問題なくコンパイルので

template <typename T>部分が重要である私の質問は明白です:右誰?

g ++またはclang ++?

g ++が正しく、これはclang ++のバグだと思うが、私は確認を求める。

p.s .:申し訳ありませんが、私の悪い英語です。

+1

これはクランの問題だった –

+1

... GCC 6.1と打ち鳴らす3.8を試してみてください。それは3.8で動作します:https://godbolt.org/g/JkCJ6l – refi64

答えて

0

私は同じ問題がありました。ここにはsolutionがあります。 暗黙の自動復帰型はC++ 14以降でのみ許可されるので、-std=c++14コンパイルフラグを使用するか、明示的にC++ 11の戻り値の型を設定する必要があります。

問題は、CLangがテンプレートクラスのテンプレート関数を特化していないことです。これを克服するには、テンプレートクラスの空の宣言を持っている必要があり、別の専門分野:

template <bool> 
struct foo; 

template <> 
struct foo <false> 
{ 
    template <typename T> 
    auto bar (int i) 
    { return i; } 
}; 


template <> 
struct foo <true> 
{ 
    template <typename T> 
    auto bar (int i) 
    { return i; } 
}; 

int main() 
{ 
    return 0; 
} 
+0

あなたの努力に感謝しますが、 "ソリューション"へのリンクは私の質問で引用した "別の質問"へのリンクです。そして、受け入れられた「解決策」がその質問に対する私の答えです。そして、明らかに、C++ 14、非C++ 11、どのようにタグ付けされているか(C++ 11タグはありません)について話しています。私の質問は「解決する方法」ではありません。しかし、 "誰が正しいの?"あなたは(私が正しく理解すれば) "g ++が正しくてclang ++が間違っている"と言っています。しかし、私は正式な基準の関連部分を引用する答えを期待していました。 (私の悪い英語のために再び申し訳ありません)。 – max66

+0

こんにちは@ max66、申し訳ありませんが、私はすぐにあなたを認識しませんでした、あなたは最初にソリューションを提供した男でした。 私にとって、「誰が正しいのか」という疑問はありません。標準では定義でもあるテンプレート宣言が許可されており、テンプレートの特殊化が可能です。したがって、明らかにCLangは、テンプレートクラス宣言も定義している場合、テンプレートクラスspecializetionのテンプレート関数定義を作成していません。 CLangが若く、CLang 3.8.1がGCC 4.2.1(これはかなり古いバージョンです)と互換性があるため、CLandのバグではありません。まだ実装されていません。 – luart

関連する問題