Что означает ошибка C ++ «отсутствующие аргументы шаблона» - PullRequest
7 голосов
/ 03 февраля 2011

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

Ответы [ 2 ]

4 голосов
/ 03 февраля 2011

Вам также необходимо изменить свой метод MyClass :: haskey.

bool haskey(const string &s)
{
    typename MyClass<C>::iterator it = this->find(s);
    return (it != this->end());
}

Объяснение такого поведения приведено в разделе «Поиск имен, шаблоны и доступ к членам базовых классов» на http://physics.ucsd.edu/students/courses/winter2008/physics141/manuals/rhel-gcc-en-4/c---misunderstandings.html (ссылка на комментарий другого ответа, на всякий случай).

Весь фиксированный пример кода: http://ideone.com/G7Rty

3 голосов
/ 03 февраля 2011
iterator it = find(s);
return (it != end());

Эта строка должна быть как,

#ifdef WITH_TEMPLATE
           typename map<string, C>::iterator it = this->find(s);
           return (it != this->end()); 
#else
           map<string, int>::iterator it = find(s);
           return (it != end());
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...