使用函数的模板返回类型编译错误

时间:2012-11-05 12:16:01

标签: c++ templates

我在.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;
}

编译器给出了set声明的错误: 第Expected a class or namespace

const SocialConnection::FriendSet& SocialConnection::getFriends()

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

2 个答案:

答案 0 :(得分:5)

  1. getFriends定义中的类名缺少模板参数。
  2. 您无法将模板代码真正放在cpp文件中并期望它能够编译。它是一个模板,因此无论在何处使用它都会被实例化。因此,您需要将其放在标题中。

    模板&lt; typename F&gt;

    const typename SocialConnection&lt; F&GT; :: FriendSet&安培; SocialConnection&LT; F&gt; :: getFriends(){     return _socialFriends; }

答案 1 :(得分:2)

正确的定义相当冗长:

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

@pwned所说的话;它需要在实例化时可见,所以把它放在标题中。有关说明,请参阅this question

在返回类型之前还请注意typename - 这是必要的,因为FriendSet依赖名称。 This question深入解释。

相关问题