Что означает эта ошибка C ++ «Отсутствуют аргументы шаблона»

Ах, шаблоны 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 ++ примет ваш код, но разрешение использования необъявленного имени устарело)

7
задан Rob N 3 February 2011 в 19:04
поделиться