Вы путаете два понятия здесь: функция друга и функция члена.Функция друга определяется вне определения класса.Внутри класса находится только объявление friend
, в котором просто говорится, что такая и такая функция, не являющаяся членом, определенная в другом месте, имеет доступ к закрытым членам класса.
Включая тело inputHelper()
иoperator>>
вместе с их friend
декларациями вы сделали двусмысленным, являются ли они функциями-членами или друзьями.Кроме того, поскольку эти функции полностью определены внутри класса, они не существуют вне класса, поэтому компилятор выдает ошибку при попытке их использования.
На самом деле это еще интереснее.Вам не нравится, когда operator>>
является функцией-членом, потому что синтаксис ее использования одинаков, независимо от того, является ли он членом или нет.Однако, когда вы вызываете inputHelper()
, как будто он не является членом, компилятор выдает ошибку.
Способ исправить это - дать понять компилятору, кто является другом, а ктоявляется членомЕсли вы хотите, чтобы operator>>
и inputHelper()
были функциями-друзьями, вы должны только оставлять объявления друзей внутри класса и помещать их определения, то есть их тела, вне класса.
template class Forest
{
/* (other friends) */
friend void inputHelper(istream& file, int previousDepth,
ForestNode& previousNode, ForestNode *nodeArray,
int nodeCount);
friend istream& operator>>(istream& file, Forest& f1);
public:
/* ... */
private:
/* ... */
};
void inputHelper(istream& file, int previousDepth,
ForestNode& previousNode, ForestNode *nodeArray,
int nodeCount)
{
/* (dostuff) */
if(someconditional)
{
/* call inputHelper */
}
}
istream& operator>>(istream& file, Forest& f1)
{
/* (dostuff) */
/* (call inputHelper) */
}