我在.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()
我一直在寻找为什么两个小时而没有任何结果。我不能在实现中使用我的模板类的名称?我怎么能这样做?我失去了什么语法?
答案 0 :(得分:5)
您无法将模板代码真正放在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深入解释。