Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
9 / 7 / 2
Регистрация: 13.11.2014
Сообщений: 51
1

Некомпилируется при объявлении friend функции

14.03.2017, 16:02. Показов 661. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток! Может кто-нибудь объяснить почему данный код компилится:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define DEF
 
struct DEF str1
{
  int f;
};
 
class a {
 
  private:
    int f2;
    struct str1* str1;
  public:
    a() {
      str1 = 0;
    }
   a* func(struct str1* s);
 
};
 
a* a::func(struct str1* s)
{
  return new a;
}
А вот этот уже нет:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define DEF
 
struct DEF str1
{
  int f;
};
 
class a {
 
  private:
    int f2;
    struct str1* str1;
  public:
    a() {
      str1 = 0;
    }
   friend a* func(struct str1*);
};
 
a* func(struct str1* s)
{
  return new a;
}
Замечаю, что (до)объявил функцию func как friend.

Ошибка компиляции следующая:

[BCC32 Error] Unit2.h(37): E2238 Multiple declaration for 'a::str1'
[BCC32 Error] Unit2.h(32): E2344 Earlier declaration of 'a::str1'

Пример не из головы и не ради интереса. Работаю в серьезном проекте, пытаюсь заставить работать одну технологию, которая генерирует классы для сериализаии в wsdl и обратно (gSoap). И доступ к их внутренностям именно с такой идеологией (через friend функции). Написал простой аналог, из-за чего не работает. Среда Embacadero Rad Studio 5.0. Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2017, 16:02
Ответы с готовыми решениями:

Ошибка при объявлении функции
Я в теле функции обращаюсь к элементам на форме (эдиту, комбобоксу и т.д.). Компилятор на такие...

Ошибка при объявлении функции в DLL
Вот кот: //--------------------------------------------------------------------------- #include...

Использование ключевого слова __fastcall при объявлении(описании) функции
Какой вариант объявления функции предпочтительней: 1. void __fastcall SetCommandGM() { // }...

Ошибка при объявлении функции
Класс 1: #ifndef VECTOR_H #define VECTOR_H #include "point.h" #include <QString> class...

3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
14.03.2017, 19:45 2
Что, прямо вот обязательно по этой идеологии имя структуры должно совпадать с именем указателя на ее экземпляр?

C++
1
2
3
4
5
6
7
8
9
10
11
class a {
 
  private:
    int f2;
    struct str1* _str1;
  public:
    a() {
      _str1 = 0;
    }
   friend a* func(struct str1*);
};
должно компилироваться нормально. Хотя GCC сожрал и оба куска кода из первого поста
0
9 / 7 / 2
Регистрация: 13.11.2014
Сообщений: 51
16.03.2017, 15:08  [ТС] 3
volvo, идеология в том, что функции получают доступ к полям класса через прямое обращение за счёт определения friend. И отвечаю на ваш вопрос "Что, прямо вот обязательно по этой идеологии имя структуры должно совпадать с именем указателя на ее экземпляр?" - в таком виде генерируются утилитой cpp-файлы, где имя переменной-указателя на структуру совпадает с именем самой структуры. Вы говорите, что GCC "сожрал" (то есть скомпилировал?). Но C++ Builder компилирует как раз в GCC, разве нет?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
16.03.2017, 20:50 4
Цитата Сообщение от born4bits Посмотреть сообщение
C++ Builder компилирует как раз в GCC, разве нет?
Нет. У Builder-а свой компилятор. И он код из первого поста не компилирует
0
16.03.2017, 20:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2017, 20:50
Помогаю со студенческими работами здесь

Ошибка при объявлении функции
Подскажите пожалуйста в строчке void (*pAction)(A, B, size, rez) = &MAX; // чего он тут...

Выдает ошибку в при объявлении функции
вернее даже не ошибку но он просто не воспринимает видимо inc1 к слову это ValueListEditor ...

Ошибка при объявлении функции класса
функция определена: class krug{ // ... void sr(krug ob); // ... } // ... void krug::sr(krug...

Ошибка при объявлении функции в заголовочном файле
Здравствуйте! Я пытаюсь в заголовочном файле объявить вот такой метод: test.h #include...


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

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