Что меня смутило, так это то, что мне нужно предварительное объявление, прежде чем подружиться с конкретным экземпляром шаблона, даже если этот файл cpp содержит заголовочный файл, который содержит объявление и определение класса шаблона друга.
Большое спасибо.
//BagPtr.h file
template <typename T>
class BagPtr{
public:
typedef typename std::vector<T>::size_type size_type;
BagPtr():_weak_ptr(make_shared<std::vector<T>>()){}
//need to be friend of tempalte class Bag
BagPtr(const class Bag<T>& b, size_type i = 0):_weak_ptr(b._ptr), index(i){}
private:
weak_ptr<std::vector<T> > _weak_ptr;
size_type index;
};
//other.h
//includes BagPtr.h
//forward declaration.
//Compiler complains that Bag is not a class template if there is no forward declaration.
template <typename T> class BagPtr;
template <typename T>
class Bag{
public:
friend class BagPtr<T>;
//other defination
};