繁体   English   中英

模板友Function/Class前向声明

[英]Template Friend Function / Class forward declaration

为什么我们需要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,不需要前向声明。

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是首先是模板 - 这就是您需要前向声明的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM