これはコンパイルされます:
template <class T>
class Bar {};
template<class T, class Dummy=void>
class Foo;
template<class T>
class Foo <T, typename std::enable_if<
std::is_base_of<Bar<T>, T>::value
>::type> {
public:
//THIS CHANGES IN THE 2ND SNIPPET
void test () const {
std::cout << "test";
}
};
class Cat : Bar<Cat> {};
int main () {
Foo<Cat> foo;
foo.test();
return 0;
}
このエラー:
template <class T>
class Bar {};
template<class T, class Dummy=void>
class Foo;
template<class T>
class Foo <T, typename std::enable_if<
std::is_base_of<Bar<T>, T>::value
>::type> {
public:
//THIS CHANGED!
void test () const;
};
//THIS WAS ADDED SINCE THE 1ST SNIPPET!
template<class T>
void Foo<T>::test () const {
std::cout << "test";
} //error C2039: 'test' : is not a member of 'Foo<T>'
class Cat : Bar<Cat> {};
int main () {
Foo<Cat> foo;
foo.test();
return 0;
}
違いをマークしました。2 番目のコード スニペットでエラーが発生するのはなぜですか? エラーを回避しながら、宣言と定義を別々に保つにはどうすればよいですか?
私はこれと関係があると推測しています: "template void Foo::test () const"
同様に、これはメソッドtest() constがテンプレート クラス template class Fooのメソッドであることをコンパイラに伝える間違った方法です。 T>::value >::type>
もちろん、Google と StackOverflow で調べましたが、テンプレートでこのエラーが表示されるたびに、毎回異なる理由があるようです。(おそらく、多くのことが原因で C2039 エラーが発生する可能性があります。)
また、mod. または誰かがこの投稿にC2039タグを追加するのを手伝ってくれますか? 分が必要だと言っています。1500レップの そのタグを追加します。
-- とりとめのない -- 私が C++ を使用してからしばらく経っていることにも注意してください。テンプレートを使用してからさらに長くなります。これがテンプレートの使用方法としては奇妙かもしれないことは承知していますが、正当な理由があることは保証できます。