Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mamucho666
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
#1

Дружественная функция, объявлённая ранее вне пространства имён класса -> error LNK2019 в Visual Studio 2012 - C++

25.12.2012, 17:41. Просмотров 674. Ответов 5
Метки нет (Все метки)

Всем привет. Долгое время пытался откопать ответ в гугле, но не получилось. Заранее благодарен.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void f(){};
namespace space
{
    class ok
    {
        friend void f();
    public:
        ok(){f();}
    };
}
int main() 
{
    space::ok a;
    return 0;
}
В итоге получаю:

Код
1>  main.cpp
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl space::f(void)" (?f@space@@YAXXZ) в функции "public: __thiscall space::ok::ok(void)" (??0ok@space@@QAE@XZ)
1>D:\Self-Education\С++\Project\main\Debug\main.exe : fatal error LNK1120: неразрешенных внешних элементов: 1
То есть почему-то объявление функции f() дружественной происходит так, как будто она не была ранее объявлена (в глобальной области), в результате чего её имя помещается в окружающую область видимости - A.

Почему?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 17:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дружественная функция, объявлённая ранее вне пространства имён класса -> error LNK2019 в Visual Studio 2012 (C++):

Обращение к приватному члену класса внутри пространства имён - C++
Здравствуйте. Вот у меня есть код: #include <iostream> #include <conio.h> #include <vector> #include <string> using namespace...

Visual Studio 2012 Ошибка 1 error : Required file "tracker.exe" is missing. - C++
vs 2012 #include "stdafx.h" #include <iostream> using namespace std; int main() { cout<<"123"<<endl; return...

Дружественная функция класса - C++
Проблема в том что дружественная функция класа механик в класе car (friend void update_status) не может обращатся к полям, почему? ...

MSVS 2012 error LNK2019: unresolved external symbol - C++
Ребят, всем доброго вечера. Подскажите пожалуйста, в чем подвох. /// /// Common.h ...

Шаблон класса и дружественная функция - C++
Доброго времени суток. Столкнулся с непониманием одного процесса. Задача звучит следующим образом: Написать шаблон функции isEqualTo для...

Дружественная шаблонная функция шаблонного класса - C++
Не компилируется. Подскажите правильный синтаксис. template<typename T> class A; template<typename T, typename ... Args> void func(A<T>...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
25.12.2012, 19:09 #2
Я не пойму что вам нужно.

1. Если у вас должна быть одна f(), то тогда сотрите void f(){};, и после интерфейса класса определите её.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace space
{
    class ok
    {
        friend void f() {}
    public:
        ok(){f();}
    };
}
int main() 
{
    space::ok a;
    return 0;
}
2. Если, нужно две (в пространстве space, и глобальная), то тогда нужно добавить определение второй (та которая friend).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void f(){};
namespace space
{
    class ok
    {
        friend void f() {}
    public:
        ok(){f();}
    };
}
int main() 
{
    space::ok a;
    return 0;
}
0
mamucho666
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
25.12.2012, 19:39  [ТС] #3
Мне нужно объяснить, почему "friend void f();" работает так, как будто ранее эта функция никогда не объявлялась.

То есть я ожидал, что "friend void f();" объявит ::f() дружественной, потому что не найдя в области "space", компилятор бы начал искать объявление в глобальной области.

А на деле происходит, что объявления f() в глобальной области не видно (или оно даже не ищется?) и получается, что f() помещается в область "space".

Или я могу поставить свой вопрос по другому: Почему, чтобы мой код корректно работал, нужно использовать "friend void ::f()".

Поиск объявления (в случае объявления дружественности) идёт только по области видимости, в которой расположено объявление класса?
0
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
25.12.2012, 19:51 #4
mamucho666,
допустим у вас есть две переменные х, одна локальная, вторая глобальная. Ну так вот сначала идёт всегда локальная, тоесть если вы напишите х = 10, то это означает, что локальная = 10, чтобы получить доступ к глобальной, с таким же именем (х) нужно указать глобальную область видимости ::х = 10.

С функциями в вашем примере так же.

Добавлено через 2 минуты
Но есть одно но.

Добавлено через 56 секунд
C++
1
friend void f();
это прототип, стало быть обьявление вы должны писать после.
0
mamucho666
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
25.12.2012, 21:18  [ТС] #5
Это понятно, но продолжая пример с переменными, хочу заметить, что у меня нет локальных переменных.

На всю программу есть только одно объявление функции f() и оно в самой первой строке. Оно же глобальное. Где локальная функция?

P.S. Или само по себе объявление функции дружественной "friend void f();" и является её объявлением? В контексте моего кода локальным?
0
Croessmah
Эксперт CЭксперт С++
13221 / 7493 / 845
Регистрация: 27.09.2012
Сообщений: 18,412
Записей в блоге: 3
Завершенные тесты: 1
25.12.2012, 22:38 #6
Цитата Сообщение от mamucho666 Посмотреть сообщение
В итоге получаю:
Ошибка линковщика. У Вас нет реализации функции f() и линковщик не может её найти. Поэтому и выдает ошибку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void f(){};
namespace space
{
    class ok
    {
        friend void f();
    public:
        ok(){f();}
    };
     void f(){}//////////////.........
}
int main() 
{
    space::ok a;
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2012, 22:38
Привет! Вот еще темы с ответами:

Преобразование типа аргумента в тип класса и дружественная функция - C++
Добрый день. Есть код: class Cls { private: double x; public: Cls(); Cls(double);

Дружественная функция-оператор, доступ к закрытым полям класса - C++
У меня есть класс MyClass, вот код: class MyClass { int x, y; public: MyClass(); friend ostream & operator << (ostream &,...

Почему дружественная функция не может обратиться к protected полю класса? - C++
Не могу понять, почему функция не может обратиться к protected полю класса: class Ships { protected: int hits; int ships; ...

Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? - C++
В заголовочном файле &quot;klass.h&quot; есть класс: class klass { int x; public: klass(); ~klass(); void show(); friend void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.12.2012, 22:38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru