Ааа, шаблоны C ++ ...
Код, который я вижу,
имеет смысл для меня,
, но GCC ...
не согласен.
Следующий код компилируется и запускается, как и ожидалось, но если вы раскомментируете этот #define
, вы получите ошибку, которую я не понимаю.Символ iterator
все еще имеет только одну вещь, на которую он может ссылаться: typedef в суперклассе.Итак, я думаю, у меня есть два вопроса: 1. Что означают ошибки?2. Как лучше всего их исправить.
#include <map>
#include <string>
#include <cstdio>
using namespace std;
// #define WITH_TEMPLATE 1
#ifdef WITH_TEMPLATE
template <class C>
struct MyClass : public map<string, C>
#else
struct MyClass : public map<string, int>
#endif
{
bool haskey(const string &s)
{
iterator it = find(s);
return (it != end());
}
};
int main()
{
#ifdef WITH_TEMPLATE
MyClass<int> m;
#else
MyClass m;
#endif
m["test"] = 10;
printf("%d %d\n", m.haskey("test"), m.haskey("no"));
}
Ошибки из GCC:
temp.cc: в функции-члене 'bool MyClass :: haskey (const std:: string &) ':
temp.cc:18: ошибка: пропущены аргументы шаблона перед' it '
temp.cc:18: ошибка: ожидается `;'до 'it'
temp.cc:19: ошибка: 'it' не была объявлена в этой области
temp.cc:19: error: нет аргументов для end, которые зависят отпараметр шаблона, поэтому должно быть доступно объявление 'end'
temp.cc:19: error: (если вы используете '-fpermissive', G ++ примет ваш код, но разрешит использование необъявленного имениустарела)