Зачем нам нужно предварительное объявление, прежде чем подружиться с конкретным экземпляром шаблона - PullRequest
0 голосов
/ 27 октября 2018

Что меня смутило, так это то, что мне нужно предварительное объявление, прежде чем подружиться с конкретным экземпляром шаблона, даже если этот файл 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
};
...