Как я могу использовать вложенный класс из функции друга? - PullRequest
0 голосов
/ 14 апреля 2019

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

template <typename T>
class LL;

template <typename T>
std::ofstream& operator<< (std::ofstream& output, LL<T>& obj);

template <typename T>
class LL
{
    struct Node
    {
        T mData;
        Node *mNext;

        Node();
        Node(T data);
    };

private:
    Node *mHead, *mTail;
    int mCount;

public:
    LL();
    ~LL();
    bool insert(T data);
    bool isExist(T data);
    bool remove(T data);
    void showLinkedList();
    void clear();
    int getCount() const;
    bool isEmpty();

    friend std::ofstream& operator<< <>(std::ofstream& output, LL& obj);
};

template <typename T>
std::ofstream& operator<<(std::ofstream& output, LL<T>& obj)
{
    Node* tmp;

    if (obj.mHead != NULL)
    {
        tmp = obj.mHead;

        while (tmp != NULL)
        {
            output << tmp->mData << std::endl;
            tmp = tmp->mNext;
         }
     }

    return output;
}

Обратите внимание, что мне нужна команда "tmp-> mData"часть в оператор Friend << определение функции для работы с шаблоном.К сожалению, единственные ошибки, которые я получаю сейчас, находятся в определении функции друга.Он не понимает «Узел», несмотря на то, что это функция друга.Я очень смущен.Надеюсь, кто-нибудь может мне помочь. </p>

1 Ответ

0 голосов
/ 15 апреля 2019

Будучи другом и контролем доступа в целом, никогда не влияет на поиск имени. (Это иногда бесполезно, но ортогональность легко рассуждать и гарантирует, что изменение доступа члена не меняет смысл программы (за исключением некоторых случаев SFINAE), просто может сделать ее не компилируемой .) Так как частная жизнь не мешает найти имя, дружба не помогает найти его. Используйте

typename LL<T>::Node *tmp;
...