0

似たような質問がたくさんあることに気付きましたが、私の問題を解決するものは見つかりませんでした (読んでください: 私は自分のケースに適用できるように答えを本当に理解していませんでした)

私は次の機能を持っています:

void printVariable(map<string, bool*>::iterator it)
{
   cout << it->first << " " << *(it->second) << endl;
}

今、map<string, bool*> mapping私が持っている場合、次のことができます:printVariable(mapping.begin());

これは機能します。今は aa もありmap<string, int*>、同じことができるようにしたいので、printVariable 関数を変更することにしました。

template <typename T>
void printVariable(map<string, T*>::iterator it)
{
   cout << it->first << " " << *(it->second) << endl;
}

ただし、これによりコンパイルエラーが発生します(gcc):

error: variable or field 'printVariable' declared void
error: expected ')' before 'it'

関数をオーバーロードすることで、これをかなり簡単に回避できると思います。しかし、上記が機能しない理由を知りたいです。

Edit2: 正しい解決策が間違っていると主張するテキストを削除しました

4

1 に答える 1

5

typename依存する名前を明確にするために言う必要があります:

template <typename T>
void printVariable(typename map<string, T*>::iterator it)
//                 ^^^^^^^^

ただし、これは推論可能なコンテキストではないため、このフォームはそれほど便利ではないことに注意してください。

さらに良いことに、イテレータ全体をテンプレートパラメータにするだけです。

template <typename Iter>
void printVariable(Iter it)
{ /* ... */ }

このようにして、非標準のコンパレータまたはアロケータを使用したマップ、および順序付けされていないマップなどもキャプチャします。


これは、最初の状況で推論可能なコンテキストがない理由についての簡単な思考実験です。T次の呼び出しでどのように推論する必要がありfooますか?

template <typename T> void foo(typename Bar<T>::type);

template <typename T> struct Bar { typedef char type; };
template <> struct Bar<int>      { typedef int type; };
template <> struct Bar<double>   { typedef int type; };

foo(10); // What is T?
于 2012-04-13T12:30:01.167 に答える