Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 06.06.2012
Сообщений: 13
1

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2012, 17:41
Ответы с готовыми решениями:

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

Скажите если я напишу программу на C# в MS Visual studio 2012 на framework 3.5 я потом смогу открыть проект моей программы на MS Visual studio 2008
Скажите если я напишу программу на C# в MS Visual studio 2012 на framework 3.5 я потом смогу...

Как открыть проект созданный в Visual Studio 2012 в Visual Studio 2008?
Нашел здесь же тему открытия Visual Studio 2012 в Visual Studio 2010 там написано так. Открыть...

Не работает отладка кода в Visual Studio pro 2012+qt visual studio add-in 1.2.1
Здравствуйте, скажите пожалуйста в чем проблема, запускаю этот код (F5) в Visual Studio #include...

5
433 / 368 / 149
Регистрация: 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
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
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
25.12.2012, 19:51 4
mamucho666,
допустим у вас есть две переменные х, одна локальная, вторая глобальная. Ну так вот сначала идёт всегда локальная, тоесть если вы напишите х = 10, то это означает, что локальная = 10, чтобы получить доступ к глобальной, с таким же именем (х) нужно указать глобальную область видимости ::х = 10.

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

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

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

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

P.S. Или само по себе объявление функции дружественной "friend void f();" и является её объявлением? В контексте моего кода локальным?
0
Неэпический
18099 / 10685 / 2061
Регистрация: 27.09.2012
Сообщений: 26,895
Записей в блоге: 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
25.12.2012, 22:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2012, 22:38
Помогаю со студенческими работами здесь

Стоит ли переходить на Visual Studio 2013 Express c Visual Studio 2012 Ultimate
Слишком дорого стоят полные версии. Какие значимые функции теряются при переходе на версию Express ?

Как проект на visual studio 2012 открыть на visual studio 2008
Программа(курсовая) создана на 2012, надо показать и чтобы работала на 2008. Подскажите пожалуйста...

При создании проекта класса WPF не видит некоторые пространства имён
Создаю проект класса. В итоге: Dim DataSet As System.Data.DataSet '- видит Dim Paragraph As...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru