2

我在 .hpp 中有一个带有此声明的模板类:

  template<class FriendClass> class SocialConnection{

    typedef std::set<FriendClass> FriendSet;
    FriendSet _socialFriends;
    public:
       virtual const FriendSet& getFriends();

在 .cpp 中:

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

编译器给我一个集合声明的错误: Expected a class or namespace对于该行const SocialConnection::FriendSet& SocialConnection::getFriends()

我一直在寻找原因两个小时,但没有任何结果。我不能在实现中使用我的模板类的名称?我怎么能这样做?有什么我丢失的语法吗?

4

2 回答 2

5
  1. 您的 getFriends 定义中的类名缺少模板参数。
  2. 你不能真的把你的模板代码放在一个 cpp 文件中并期望它编译。它是一个模板,所以无论在哪里使用它都会被实例化为一个类型。因此,您需要将其放在标题中。

    模板 <类型名 F>

    常量类型名 SocialConnection< F>::FriendSet& SocialConnection< F>::getFriends() { return _socialFriends; }

于 2012-11-05T12:29:53.107 回答
2

正确的定义相当冗长:

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

@pwned 说了什么;它需要在实例化时可见,因此将其放在标题中。请参阅此问题以获取解释。

还要注意typename返回类型之前 - 它是必需的,因为它FriendSet是一个依赖名称。 这个问题深入解释了它。

于 2012-11-05T12:32:53.307 回答