2012-11-05 144 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深入解释。

相关问题