2011-03-05 86 views
2

我想重複列表中的成員函數。在此代碼示例中,我收到了編譯器錯誤的代碼行:會員模板功能。爲什麼不編譯?

預期;在它之前,它沒有宣佈,最終沒有宣佈。

爲什麼? 該功能甚至不用於代碼!

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; 
} 

我明白了,我在模板編程中缺少一些東西。 謝謝你的提示!

+0

順便說一句:我投票拒絕你提出的添加'qt'標記的編輯。問題的本質與QT沒有任何關係。 – Jon 2011-03-05 13:20:41

+0

看看這個線程:http://stackoverflow.com/questions/610245/where-to-put-the-template-and-typename-on-dependent-names – 2011-03-05 17:20:08

回答

7

這樣做:

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

當寫T::ConstIterator,編譯器可以解釋,由於「靜止構件T類型的ConstIterator」或爲「由一個typedef在T類型定義爲ConstIterator類型」。

如果你的意圖是第二個,如在這裏,你需要添加typename來告訴編譯器。

+0

+1:謝謝!!!我已經在這方面閱讀過關於typename的內容,但這是我第一次使用它。 – 2011-03-05 13:18:21

1

編譯器無法知道T :: ConstIterator是一個類型(因爲它不知道T是什麼)。您可以通過在其前面添加一個typename來表明。