模板:我需要更好地学习这些吗?为啥我会收到错误

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&lt;listClass, itemClass&gt; 的任何特定实例化的特定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() 的代码我认为它只是beginend 所以我需要找到他们是如何使用它的。也许是定制的,但他们选择了错误的命名约定【参考方案2】:

官方 C++ 不知道依赖符号是类型还是其他类型。对你来说,程序员listClass::iterator 显然是一种类型。编译器需要一些帮助。

iter的定义应该是:

typename listClass::iterator iter

【讨论】:

【参考方案3】:

其他答案已经回答了为什么会出错 至于你的问题的第二部分:一个好的模板资源也值得赞赏

关于 C++ 模板最权威的书籍是:C++ 模板:完整指南David Vandevoorde 和 Nicolai Josuttis p>

【讨论】:

以上是关于模板:我需要更好地学习这些吗?为啥我会收到错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到这些错误,java truetype 错误?

为啥我会收到错误消息?

为啥我会收到涉及 `_kFIRLoggerInstanceID` 的错误?

Backbone.js 视图是不是需要 jQuery 或 Zepto? (或者:为啥我会收到“未捕获的类型错误:未定义不是函数”?)

任何人都知道为啥我会收到“快照侦听器中未捕获的错误:FirebaseError:缺少权限或权限不足”吗?

为啥我会收到不支持的操作数类型错误?