啊,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 ++将接受您的代码,但不允许使用未声明的名称)
答案 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