如何使用友元函数中的嵌套 class?
How can I use a nested class from a friend function?
正当我得到一个解决方案时,我又遇到了另一个问题。看,我的模板链表中有一个 friend 语句,我需要将它作为 friend 才能到达我的私有嵌套 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;
}
请注意,我需要 friend operator<< 函数定义中的 "tmp->mData" 部分才能使用模板。不幸的是,我现在得到的唯一错误是在友元函数定义中。它不理解 'Node' 尽管它是一个友元函数。我很困惑。希望有人能帮助我。
一般来说,作为朋友和访问控制永远不会影响姓名查找。 (这有时没有帮助,但正交性很容易推理并保证更改成员的访问权限不会 改变 程序的含义(某些 SFINAE 情况除外),只是可能使其无法编译。)因此,正如私有不会阻止找到名字一样,成为朋友也无助于找到它。使用
typename LL<T>::Node *tmp;
正当我得到一个解决方案时,我又遇到了另一个问题。看,我的模板链表中有一个 friend 语句,我需要将它作为 friend 才能到达我的私有嵌套 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;
}
请注意,我需要 friend operator<< 函数定义中的 "tmp->mData" 部分才能使用模板。不幸的是,我现在得到的唯一错误是在友元函数定义中。它不理解 'Node' 尽管它是一个友元函数。我很困惑。希望有人能帮助我。
一般来说,作为朋友和访问控制永远不会影响姓名查找。 (这有时没有帮助,但正交性很容易推理并保证更改成员的访问权限不会 改变 程序的含义(某些 SFINAE 情况除外),只是可能使其无法编译。)因此,正如私有不会阻止找到名字一样,成为朋友也无助于找到它。使用
typename LL<T>::Node *tmp;