0

次の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

しかし、なぜ疑問が残りますか?

4

2 に答える 2

3

あなたは次のようなコードを見慣れています:

T(arg1, arg2)

タイプの一時を作成するためT。これは、次のような表現でよく見られます。

f(T(arg1, arg2))

また、引数が 1 つの場合も見てきました。

f(T(arg1))

ただし、想定される一時的な作成がコード行の完全なステートメントである場合、構文的に宣言と区別できません。

あれは:

T(arg1);

以下と同じです:

T arg1;

コードの一部が宣言または式である場合、それは常に宣言です。これは基本的に、最も厄介な parseの例です。

()ステートメントを式として読むように強制して、あいまいさを解消するために使用できます。

(T(arg1));

しかし、一般的には、一時的なものを独自の行に作成してから何もしない必要があると感じる理由を尋ねます。

于 2013-02-17T13:30:43.903 に答える
1

オブジェクトを定義したいですね。

次に、Tokenize<std::function<bool (wchar_t)> >(foo);する必要がありますTokenize<std::function<bool (wchar_t)> > tokenizer(foo);

于 2013-02-17T13:18:42.827 に答える