1

テンプレートの特殊化について重要なことを明らかに誤解しています。

template<typename type> const type getInfo(int i) { return 0; }
template<> const char* getInfo<char*>(int i) { return nullptr; }

コンパイルに失敗します:

src/main.cpp:19:24: error: no function template matches function
        template specialization 'getInfo'

その間

template<typename type> type getInfo(int i) { return 0; }
template<> char* getInfo<char*>(int i) { return nullptr; }

正常に動作します。constテンプレートの特殊化を使用するにはどうすればよいですか? 私の新人ミスは何ですか?

私はclang ++でc ++ 11を使用しています。

4

2 に答える 2

5

最初の例では、戻り型はconst typeであるため、constは型全体に適用されることに注意してください。typeが(専門分野の場合char*のように)の場合、戻りタイプはchar * const。です。これはうまくコンパイルされます:

template<typename type> const type getInfo(int i) { return 0; }
template<> char* const getInfo<char*>(int i) { return nullptr; }

これは理にかなっています-型をポインタとして特殊化する場合。ポインターが何を指しているのかについて、テンプレートが何かを言う必要があるのはなぜですか?

ただし、この状況では、リターンタイプをにする理由はあまりありませんconst

于 2013-02-26T18:05:17.650 に答える
1

文字列定数を返す必要がある場合は、これを使用してください:

template<typename type> type getInfo(int i) { return 0; }
template<> const char* getInfo<const char*>(int i) { return nullptr; }

あなたがやろうとしたことは次のようなものです:

const int getInfo( int i ) { return 0; }

あまり意味がありません。

于 2013-02-26T18:13:01.310 に答える