2016-05-12 4 views
2

У меня есть класс класса Node - это знакомый с классом BinaryTree, который содержит элемент типа Node. Я хочу сделать BinareTree любого типа, поэтому я использую шаблоны для обоих классов. Как и в этом коде:Шаблоны классов и друзья Классы

template <class T> 
class Node 
{ 
    T value; 
    Node<T> *left, *right; 
    friend template <typename T> class BinaryTree; // here is the problem 
}; 
template <class Y> 
class BinaryTree{...}; 

Что синтаксис мне нужно вам в декларации друга класса BinaryTree, если я буду использовать его в качестве шаблона? Моя цель состоит в том, чтобы иметь возможность написать:

BinareTree<int> tree; 

Есть ли лучший способ это, что я подумал? Спасибо!

+0

Помните, первый вопрос, который нужно задать при использовании 'friend': вы действительно уверены, что вам нужно использовать' friend'? – Kupiakos

+0

@ Kupiakos Обратите внимание, что есть [способы рефакторинга отношения друзей] (http://stackoverflow.com/questions/27492132/how-can-i-remove-refactor-a-friend-dependency-declaration-properly) , иногда это имеет смысл (например, ради прагматизма), просто использовать «друга», если вы хорошо знаете, что делаете. –

+0

@Kupiakos Да, мне нужно, потому что я хочу иметь доступ к частным членам класса Node в классе BinaryTree. – Copacel

ответ

4

Если вы выполните поиск синтаксиса template friends, вы сможете найти правильный способ сделать это:

class A { 
    template<typename T> 
    friend class B; // every B<T> is a friend of A 

    template<typename T> 
    friend void f(T) {} // every f<T> is a friend of A 
}; 

Хотя вы, вероятно, просто хотите друг конкретного одна:

friend class BinaryTree<T>; 
+0

[Обратите внимание, что требуются разные имена параметров шаблона] (http://coliru.stacked-crooked.com/a/0495156f9adb8f27), когда 'class A' является самим классом шаблона. –

Смежные вопросы