这个'缺少模板参数'C ++错误的含义是什么?

时间:2011-02-03 19:04:08

标签: c++ templates

啊,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"));
}

海湾合作委员会的错误:

  

temp.cc:在成员函数'bool MyClass :: haskey(const std :: string&amp;)'中:   temp.cc:18:错误:在'it'之前缺少模板参数
  temp.cc:18:错误:期待`;'在'它'之前   temp.cc:19:错误:'它'未在此范围内声明
  temp.cc:19:错误:没有依赖于模板参数的'end'参数,因此'end'的声明必须可用
  temp.cc:19:错误:(如果使用'-fpermissive',G ++将接受您的代码,但不允许使用未声明的名称)

2 个答案:

答案 0 :(得分:4)

您还需要更改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

答案 1 :(得分:3)

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