Ах, шаблоны C ++ ...
Я вижу код
имеет смысл для меня,
но GCC ...
он не согласен.
Следующий код компилируется и выполняется, как ожидалось, но если вы раскомментируете этот #define
, вы получите ошибку, которую я не понимаю. У символа итератора
все еще есть только одно, на что он может ссылаться: определение типа в суперклассе. Думаю, у меня есть два вопроса: 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: ошибка: отсутствуют аргументы шаблона перед «оно»
temp.cc:18: ошибка: ожидается `; ' перед "оно"
temp.cc:19: ошибка: "это" не было объявлено в этой области
temp.cc:19: error: нет аргументов для 'end', которые зависят от параметра шаблона, поэтому должно быть доступно объявление 'end'
temp.cc:19: error: (если вы используйте '-fpermissive', G ++ примет ваш код, но разрешение использования необъявленного имени устарело)