0

私はこれらの2つのファンクターを持っています:

template<typename T>
struct identity {
    const T &operator()(const T &x) const {
        return x;
    }
};

template<typename KeyFunction>
class key_helper {

public:
    key_helper(const KeyFunction& get_key_) : get_key(get_key_) { }

    template<typename T, typename K>
    const K operator()(const T& x, const int& n) {
        return get_key(x);
    }

private:
    KeyFunction get_key;
};

ただし、テンプレート化された関数で2番目のファンクターを使用すると. エラーが発生しました:

template<typename T, typename K>
void test(T item, K key) {

    identity<T> id;
    key_helper<identity<T> > k(id);

    K key2 = k(item, 2); // compiler cannot deduce type of K
    key2 = k.operator()<T, K>(item, 2); // expected primary-expression before ',' token
}

operator()関数からファンクターを呼び出すにはどうすればよいtestですか?

4

1 に答える 1

4

operator(),の戻り値の型を推測できないKため、テンプレート引数を明示的に指定する必要があります。2 回目の試行が機能しない理由は、次のtemplateキーワードを含める必要があるためです。

K key2 = k.template operator()<T,K>(item, 2);
于 2012-12-08T19:04:02.897 に答える