2012-11-05 199 views
2

我有一個模板類,這一聲明在.HPP編譯錯誤與模板返回類型的函數

const SocialConnection::FriendSet& SocialConnection::getFriends() { 
    return _socialFriends; 
} 

編譯器給我一個錯誤的設置聲明: Expected a class or namespace爲行const SocialConnection::FriendSet& SocialConnection::getFriends()

我一直在尋找爲什麼兩個小時,沒有任何結果。我不能在實現中使用我的模板類的名稱?我該怎麼做?我失去了什麼語法?

+0

你有沒有'#include '? –

+0

是的,它包括在內。錯誤在.cpp中給出,如果我刪除函數的行.cpp實現它工作正常... – Jpellat

回答

5
  1. getFriends定義中的類名缺少模板參數。
  2. 你不能真正把你的模板代碼放在一個cpp文件,並期望它編譯。它是一個模板,所以它被實例化爲一個類型,無論它在哪裏使用。因此,您需要將其放在標題中。

    模板<類型名稱˚F>

    const的類型名稱SocialConnection <˚F> :: FriendSet & SocialConnection <˚F> :: getFriends(){ 返回_socialFriends; }

+0

「2. ..把它放在一個頭文件...」或「#include」implementation.cpp「在你的標題後面,或者... – xtofl

+0

你在返回類型之前缺少'typename'。 – jrok

+0

@jrok你是對的,否則編譯器不知道如果FriendSet是一個類型或變量名稱 – nurettin

2

正確的定義是比較囉嗦:

template<typename FriendClass> 
const typename SocialConnection<FriendClass>::FriendSet& 
SocialConnection<FriendClass>::getFriends() 
{ 
    return _socialFriends; 
} 

什麼@pwned說。它需要在實例化的時候可見,所以把它放在頭文件中。有關說明,請參閱this question

注意的返回類型之前也typename - 這是neccessary,因爲FriendSet從屬名稱。This question深入解釋。

相關問題