【发布时间】:2013-01-10 09:04:07
【问题描述】:
可能重复:
Where and why do I have to put the “template” and “typename” keywords?
我(不得不 :))几周前成为了一名 C++ 开发人员(我之前有过一些经验,但不是太多,我更多的是在 Java 中),试图学习所有重要的东西并像开发一样高效我可以。如果我的问题完全愚蠢,请原谅。我对一个简单的示例模板类有疑问:
template<typename T>
class SameCounter {
private:
map<T,int> counted;
public:
SameCounter(list<T> setup) {
for(list<T>::iterator it = setup.begin(); it != setup.end(); it++) {
counted[*it]++;
}
}
map<T,int>::const_iterator& begin() { // line 25
return counted.begin();
}
map<T,int>::const_iterator& end() {
return counted.end();
}
};
...
// using the class
Reader rdr;
rdr.Read();
SameCounter<char> sc(rdr.GetData());
我在编译时遇到了一些错误:
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int d:\learn_cpp\examples\gyakorlas_1.cpp 25
Error 2 error C2143: syntax error : missing ';' before '&' d:\learn_cpp\examples\gyakorlas_vizsga\gyakorlas_1.cpp 25
(both of them twice)
我对此一无所知,我假设的模板可能有问题,因为如果我将 SameCounter 创建为普通类,那完全没问题。谢谢你的帮助。
【问题讨论】:
-
在
lsit<T>::iterator之前需要一个typename并且地图的 const 迭代器也是如此。 -
在不知道第 25 行是什么(发生错误的位置)的情况下有点难以回答。但总的来说,这两个错误所说的是 A,您试图定义一个没有类型定义的变量,而 B 您忘记解析某些内容,或者您试图将函数定义为引用(如果您返回 &val 函数想将其分配为指针使用 *)
-
“奇怪的行为”可能是你能选择的最糟糕的标题。只有几个问题真的很蠢,这看起来不像,但写得不好。
-
是的,很抱歉。当我想引用内部类型时,我忘记了模板发生的一个小“问题”。如下回答。谢谢大家。
-
为了将来参考,在编写代码摘录时,最好标记错误消息中提到的行(例如使用
//line 25 here之类的注释。
标签: c++ templates iterator typedef