Странная ошибка при связывании статического класса с функцией друга

У меня много проблем с моим кодом C ++, но я не могу понять, почему.

Я занимаюсь разработкой статической библиотеки libmylib.a, которая содержит myclass.h и myclass.cpp.

Проблема у меня такая:

// myclass.h
class myClass{
public:
myclass();
myclass(a,b);

// some methods.

private:
int a ;
int b ;
};

В myclass.cpp я определяю методы конструкторов и т. Д., И т. Д., И все работает нормально:
Я могу использовать библиотеку в моем коде main.cpp.

Затем я добавил функцию друга:

// myclass.h
class myClass{
public:
myclass();
myclass(a,b);
friend void foo() ;

// some methods.

private:
int a ;
int b ;
};

Я определяю функцию foo в myclass.cpp следующим образом

// myclass.cpp
void foo(){
cout << "In foo function " ;
}

Проблема в том, что если я пытаюсь использовать foo () в main.cpp, я получаю ошибку компиляции, которая гласит:

//main.cpp
#include "myclass.h" // foo() is declared here!

foo() ;

main.cpp: 62: 6: ошибка: «foo» не был объявлен в этой области

Теперь я действительно не могу понять, где проблема.
Я заметил, что после добавления функции друга кажется, что компоновщик больше не использует mylib, но я не могу понять, почему. Более того, это странно, потому что, если я прокомментирую foo () в main.cpp, myclass и его методы могут быть использованы без проблем.

Что я делаю неправильно? Я провел два часа, пытаясь понять, но на самом деле не могу понять !!!

Решение: следуя совету в ответе:

// myclass.h
void foo() ; // the function has to be declared outside the class

class myClass{
public:
myclass();
myclass(a,b);
friend void foo() ; // but here you have to specify that
// is a friend of the class!
// some methods.

private:
int a ;
int b ;
};

1

Решение

Это не ошибка компоновщика, это ошибка компилятора. Компилятор говорит вам, что не знает, как вызывать функцию fooпотому что ему не хватает своего определения или декларации.

Объявление функции в качестве друга не заменяет правильное объявление. Когда ты сказал foo это друг, ты тоже не представляешь foo в сферу. В каком-то смысле объявление дружбы — это частная деталь вашего класса, невидимая извне.

Чтобы использовать функцию в C ++, вам нужно сначала объявить ее. Обычно это делается через заголовочный файл, соответствующий файлу реализации, но вы можете сделать это просто так:

void foo ();

Если foo определяется в том же файле, что и main, вы можете двигаться foo впереди main чтобы решить проблему (просмотр определения функции перед первым использованием в порядке с компилятором).

2

Другие решения

Вы объявили foo перед его использованием:

#include "header_where_foo_is_declared.h"int main()
{
foo();
}

или же

void foo();
int main()
{
foo();
}

???

0