微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

模板友元函数/类前向声明

如何解决模板友元函数/类前向声明

为什么我们需要 BlobPtr 的模板前向声明和模板的运算符重载。

template <typename> class BlobPtr;
template <typename> class Blob; 

template <typename T>
    bool operator==(const Blob<T>&,const Blob<T>&); 

template <typename T> 
class Blob {
    friend class BlobPtr<T>; 
    friend bool operator==<T>
        (const Blob<T>&,const Blob<T>&); 

};
class BlobPtr<T>{};

Blob<char> ca; 

Blob<int> ia; 

对于非模板类,不需要前向声明。

class Blob {
type
    
   class BlobPtr; 
   friend bool operator==
        (const Blob&,const Blob&); 

};
class BlobPtr{};

解决方法

如果你想在友元声明中声明模板,你可以这样做,你不需要前向声明:

template <typename T> 
class Blob {
    template <typename U>
    friend class BlobPtr;     

    template <typename U>
    friend bool operator==(const Blob<U>&,const Blob<U>&); 
};

这将模板的所有实例声明为朋友,而不仅仅是匹配的。也就是说,BlobPtr<int>BlobPtr<long>(通常是 BlobPtr<Anything>)都是 Blob<int> 的朋友。

如果您想将模板的特定特化声明为友元(这样 BlobPtr<int>Blob<int> 的友元但 BlobPtr<long> 不是),那么您首先需要告诉BlobPtr 首先是模板的编译器 - 这就是您需要前向声明的内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。