1

クラステンプレートの使い方を学んでいます。いくつかの例を読みましたが、まだいくつか問題があります。

ヘッダーに次のテンプレートクラスがありますfoo.h

template<typename T>
class Foo
{
 public:
    bool addKey(const std::string& key);
    bool addValue(const std::string& key, const T& value);

private:
    std::map<std::string, T> mapping;
};

これは実装ファイルですfoo.cpp

template <typename T>
bool Foo<T>::addKey(const string& key)
{
    if (key.empty()) 
        return false;

    pair<map<string, T>::iterator, bool> response; // to store the pair returned by insert()
    response = mapping.insert(pair<string, T>(key, T()));

    return response.second;
}

以下はコンパイルエラーです(Kdevelop内のg ++​​)

error: type/value mismatch at argument 1 in template parameter list for ‘template<class _T1, class _T2> struct std::pair’
error:   expected a type, got ‘std::map<std::basic_string<char>, T>::iterator’
error: invalid type in declaration before ‘;’ token
error: request for member ‘second’ in ‘response’, which is of non-class type ‘int’

それで、タイプstd::pairを扱うことができないように見えますか?T

std::pairによって返されたものを保存しない場合insert()、コンパイルは正常に機能します。

4

2 に答える 2

3

この場合iteratorは従属名であるため、次のtypenameキーワードで修飾する必要があります。

 pair<typename map<string, T>::iterator, bool>

詳細については、この質問を参照してください。

于 2013-02-14T14:19:39.080 に答える
1

pair < typename map::iteratorを書いてみてください。イテレータはテンプレートパラメータに依存するタイプであり、コンパイラはそれを認識するために少し助けが必要です。

于 2013-02-14T14:22:16.663 に答える