2016-12-02 3 views
0

У меня есть структура словарьшаблон структуры в качестве аргумента функции

template<typename T, typename U> 
struct Diccionary { 
    friend void insert<T, U>(Diccionario<T,U>& d, const T& c, const U& v); 
    friend void insertAux<T, U>(typename Diccionary<T,U>::Nodo* a, const T& c, const U& v);  

private: 
    struct Nodo{ 
     T t; 
     U u; 
     Nodo* left; 
     Nodo* right; 
    }; 

    Nodo* root; 
    Nodo* iterator; 
    int size;  
}; 

У меня есть ошибка с аргументами insertAux, я не знаю, как дать эту функцию указателя на узел. Проблема заключается в том, что узел находится в структурах, так что компилятор говорит мне:

error: no type named ‘Nodo’ in ‘struct Diccionario

Мне нужно дать эту функцию узла, потому что тогда я буду использовать рекурсивный алгоритм, и я не могу дать функции а Тип словаря, потому что дерево и словарь разные.

+3

Определение типа слова перед объявлением друзей. – SergeyA

+0

Каково определение 'Diccionario'? –

+0

Но проблема в том, что тип te должен быть закрытым, а также функция insertAux является частной, но у меня есть tu. Итак, если тип по-прежнему является частным, что я могу сделать? Тип является приватным, но функция (является частной) должна быть знакомой – Serizba

ответ

1

Сообщение об ошибке сообщает вам, что не так. В том месте, где вы его используете, Diccionary<T,U>::Nodo еще не определено.

Решение 1: определить его раньше.

template<typename T, typename U> 
struct Diccionary { 
private: 
    struct Nodo{ 
     T t; 
     U u; 
     Nodo* left; 
     Nodo* right; 
    }; 

public: 
    friend void insert<T, U>(Diccionario<T,U>& d, const T& c, const U& v); 
    friend void insertAux<T, U>(typename Diccionary<T,U>::Nodo* a, const T& c, const U& v);  

private: 
    Nodo* root; 
    Nodo* iterator; 
    int size;  
}; 

Решение 2: поскольку вы используете его как указатель, достаточно объявить его раньше.

template<typename T, typename U> 
struct Diccionary { 
private: 
    struct Nodo; 
public: 
    friend void insert<T, U>(Diccionario<T,U>& d, const T& c, const U& v); 
    friend void insertAux<T, U>(typename Diccionary<T,U>::Nodo* a, const T& c, const U& v);  

private: 
    struct Nodo{ 
     T t; 
     U u; 
     Nodo* left; 
     Nodo* right; 
    }; 

    Nodo* root; 
    Nodo* iterator; 
    int size;  
}; 

В общем Примечание: используйте friend как можно реже. Я еще не написал ни одну программу на C++, которая нуждалась в friend в любом месте моего кода, и я написал довольно много. Я считаю это запахом кода.

Также похоже, что вы пытаетесь реализовать свой собственный вид древовидной структуры. Пожалуйста, обратите внимание на использование стандартных библиотечных контейнеров. Вероятно, вам это не поможет, и если бы вы это сделали, вы бы задали разные вопросы.

+0

Спасибо, он работает. Я думаю, что это решает мою проблему. Я не пытаюсь улучшить стандартные библиотечные контейнеры, но это классовая работа, поэтому мне нужно сделать это, как хочет мой учитель. Большое спасибо! – Serizba

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