会员模板功能。为什么不编译?

时间:2011-03-05 13:11:28

标签: c++ templates

我想在列表中迭代成员函数。在此代码示例中,我在for-line中遇到编译器错误:

  

预期;在它之前,它没有宣布,结束没有宣布。

为什么呢? 该功能甚至没有在代码中使用!

template <class T> bool Settings::saveSimpleList( QString k, const T & l ){
    //...
    for ( T::ConstIterator it = l.constBegin(), end =l.constEnd(); it != end; ++it )
    {
        QString itemValue = QVariant( *it ).toString();
        //...
    }

    return true;
}

我明白了,我在模板编程中遗漏了一些东西。 谢谢你的提示!

2 个答案:

答案 0 :(得分:7)

这样做:

for (typename T::ConstIterator it = l.constBegin(), end =l.constEnd(); it != end; ++it )
{
    QString itemValue = QVariant( *it ).toString();
    //...
}

编写T::ConstIterator时,编译器可以将其解释为“ConstIterator类型的静态成员T”或“typedef定义为ConstIterator的类型”在T类型中。

如果您的意图是第二个,就像在这里一样,您需要添加typename来告诉编译器。

答案 1 :(得分:1)

编译器无法知道T :: ConstIterator是一个类型(因为它不知道T将是什么)。您可以通过在其前面添加typename来表明。