模板:我需要更好地学习这些吗?为啥我会收到错误
Posted
技术标签:
【中文标题】模板:我需要更好地学习这些吗?为啥我会收到错误【英文标题】:Templates: I need to learn these better? Why am i getting errors模板:我需要更好地学习这些吗?为什么我会收到错误 【发布时间】:2011-05-03 17:01:30 【问题描述】:我正在编写不再存在的其他人的代码,它是旧的 CodeWarrior 代码。 XCode 对此抱怨:
template <class listClass,class itemClass>
void FxStreamingObjectList<listClass,itemClass>::StreamOut(FxStream *stream)
if (listClass::size())
stream->PutSeparator();
stream->PutString(mFieldName.c_str());
stream->PutSeparator();
stream->PutBeginList();
stream->Indent(+1);
listClass::iterator iter;
for (iter=listClass::begin(); iter != listClass::end(); iter++)
stream->PutSeparator();
stream->PutString( (*iter)->GetClassID() );
(*iter)->StreamOut(stream);
stream->Indent(-1);
stream->PutSeparator();
stream->PutEndList();
stream->PutSeparator();
我在listClass::iterator iter;
和for (iter=listClass::begin(); iter != listClass::end(); iter++)
上遇到错误:
error: expected `;' before 'iter'
error: 'iter' was not declared in this scope
同一个 .h 中的其他地方,相同类型的模板声明我得到如下错误:
error: dependent-name 'listClass::iterator' is parsed as a non-type, but instantiation yields a type
在:
for (listClass::iterator iter=listClass::begin(); iter != listClass::end(); iter++)
我该如何解决这些错误?我不太了解模板,所以我很困惑,不知道从哪里开始。一个好的模板资源也值得赞赏。
【问题讨论】:
Where and why do I have to put "template" and "typename" on dependent names? 的可能重复项 When should I use the keyword "typename" when using templates的可能重复 不重复。这个问题与这两个问题完全相反! @Tomalak - 奇怪的是答案是一样的。 @BoPersson:答案相同并不意味着问题相同。 【参考方案1】:编译器直到解析过程稍后才知道FxStreamingObjectList<listClass, itemClass>
的任何特定实例化的特定listClass
具有称为iterator
的成员类型。因此名称iterator
是一个“从属名称”。
You must hint 到您期望/要求的编译器 iterator
是一个类型,带有 typename
关键字:
typename listClass::iterator iter;
和:
for (typename listClass::iterator it = listClass::begin(), end = listClass::end(); it != end; ++it)
(顺便说一句,begin()
和 end()
真的是静态成员函数吗?)
只是另一个 C++ 怪癖。 :)
【讨论】:
比我快 40 秒!坏坏。 +1 @Tomalak:根据您提供的解释,我认为您的更好。所以我删除了我的,因为它不再需要了。 @Tomalak,所以使用了任何地方 listClass 我需要在前面加上typename
以便编译器得到它是一种类型的面孔?仍然对事件链的发生方式有些困惑。
@Tomalak - 除了添加typename
之外,我是否需要更改上面的for
循环我得到一个新错误:error: invalid type in declaration before '=' token
当我这样做时for (typename iter=listClass::begin(); iter != listClass::end(); iter++)
@Tomalak - 这就是begin()
和end()
的代码我认为它只是begin
和end
所以我需要找到他们是如何使用它的。也许是定制的,但他们选择了错误的命名约定【参考方案2】:
官方 C++ 不知道依赖符号是类型还是其他类型。对你来说,程序员listClass::iterator
显然是一种类型。编译器需要一些帮助。
iter
的定义应该是:
typename listClass::iterator iter
【讨论】:
【参考方案3】:其他答案已经回答了为什么会出错 至于你的问题的第二部分:一个好的模板资源也值得赞赏
关于 C++ 模板最权威的书籍是:C++ 模板:完整指南,David Vandevoorde 和 Nicolai Josuttis p>
【讨论】:
以上是关于模板:我需要更好地学习这些吗?为啥我会收到错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥我会收到涉及 `_kFIRLoggerInstanceID` 的错误?
Backbone.js 视图是不是需要 jQuery 或 Zepto? (或者:为啥我会收到“未捕获的类型错误:未定义不是函数”?)