次のC++プログラムを検討してください
#include <cwchar>
#include <cwctype>
#include <string>
#include <functional>
template <typename Ty>
struct Tokenize {
Ty m_delim;
Tokenize(Ty& delim):m_delim(delim){}
};
int main() {
std::function<bool (wchar_t)> foo = iswdigit; //Compiles fine
Tokenize<std::string >(std::string("")); //Compiles fine
Tokenize<std::function<bool (wchar_t)> >(foo); // Fails
return 0;
}
VC ++でコンパイルしようとすると、コンパイラエラーで失敗します
error C2371: 'foo' : redefinition; different basic types
error C2512: 'Tokenize<Ty>' : no appropriate default constructor available
fooを再定義しようとしているように見えますが、どのようにすればよいのかわかりません。
注綿密な調査により、コンパイラが考慮していることが明らかになります
Tokenize<std::function<bool (wchar_t)> >(foo)
デフォルトのパラメータを使用してタイプのオブジェクトを構築する場合Tokenize<std::function<bool (wchar_t)> >
、つまり
Tokenize<std::function<bool (wchar_t)> > foo
しかし、なぜ疑問が残りますか?