C++:在模板中的声明中"expected ;"
C++: "expected ;" in declaration in template
我在模板类的成员函数中遇到了以下问题:
#include <map>
using std::map;
template <typename A,typename B>
class C {
public:
B f(const A&,const B&) const;
private:
map<A,B> D;
};
template <typename A,typename B>
B C<A,B>::f(const A&a,const B&b) const {
map<A,B>::const_iterator x = D.find(a);
if(x == D.end())
return b;
else
return x->second;
}
当我有g++编译时,我得到以下错误:
Bug.C: In member function 'B C<A,B>::f(const A&, const B&) const':
Bug.C:12: error:expected ';' before 'x'
Bug.C:13: error: 'x' was not declared in this scope
然而,当我制作类和函数的非模板化版本时,a和B都是int,它编译起来没有问题。这个错误有点令人费解,因为我无法想象它为什么想要一个";"在"x"之前。
您缺少一个typename
:
typename map<A,B>::const_iterator x = D.find(a);
请阅读我为什么要把"模板"answers"typename"关键字放在哪里?。这里需要typename
的原因是A
和B
是模板参数,这意味着::const_iterator
的含义取决于A
和B
是什么。对于一个人来说,const_iterator
这个名字很明显表明这是一个迭代器类型,而对于编译器来说,它不知道这是一种类型、数据成员等。
在实例化模板之前,编译器将在第一次通过时进行语法检查,通过添加typename
,可以让编译器知道将map<A,B>::const_iterator
解析为类型。
此外,C++中还有一条特殊规则(可耻地从关联问题中窃取):
模板声明或定义中使用的名称依赖于模板的参数被假定为不命名类型,除非适用的名称查找查找类型名称或该名称是限定的通过关键字typename。
如果不添加typename
,编译器必须假设它不是类型。
您错过了关键字typename
,它在引用类型并依赖于模板参数的限定名称之前是必需的:
typename map<A,B>::const_iterator x = D.find(a);
您必须添加typename
:
typename map<A,B>::const_iterator x = D.find(a);
说明:typename
指出,后面的名称应被视为一种类型。否则,名称将被解释为引用非类型。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 对象声明中的模板"error: expected expression"
- 在另一个类声明中创建类的对象时"Expected a type specifier"错误
- C++:在模板中的声明中"expected ;"
- 矢量声明"expected parameter declarator"
- 函数声明错误,"expected constructor, destructor, or type conversion before ';' token"