| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > friend class |
| Автор: _GRIN_ 2.12.2011, 13:38 | ||
Преамбула - всегда объявлял друзей класса прям в тебе класса без всякого forward declartion:
В основном использовал "друзей" для юнит-тестов Недавно коллега увидел это (мы с ним фэйл в юнит-тесте разбирали) и сказал, что так (без forward declaration) по стандарту работать не должно. Я чутка погуглил, но ничего явно запрещающего или явно разрещающего использование "друзей" без форвард декларейшн не нашёл. Подскажите, где в стандарте искать данную инфу? А то тут у нас холивар намечается =) |
| Автор: rumit7 2.12.2011, 14:06 | ||
C++ STANDARD-2003, раздел 11.4.9: "For a friend class declaration, if there is no prior declaration, the class that is specified belongs to the innermost enclosing non-class scope, but if it is subsequently referenced, its name is not found by name lookup until a matching declaration is provided in the innermost enclosing nonclass scope." |
| Автор: newbee 2.12.2011, 14:10 |
| Странный у тебя холивор намечается... Друх сказал тебе что-то с отсылкой на стандарт, так пусть же приведет пруф и тыкнет пальцем прямо в стандарт. Я холиворить с тобой не собираюсь, поэтому пруфы искать не буду, но скажу: по стандарту то, что указано во friend является декларацией, в т.ч. может быть и форвард дефларацией. Единственая проблема с форвард-декларацией может быть, когда ты френдишь классы из разных нэймспейсов, там есть какой-то замут, связанный с тем, что неизвестный до сих пор символ будет забинден в текущей неймспейс, т.е. френдить класс из другого неймспейса предварительно не задикларировав его нельзя. |
| Автор: rumit7 2.12.2011, 14:25 | ||||||
Раскомментируйте и ошибка компиляции исчезнет. |
| Автор: newbee 2.12.2011, 14:28 |
| Вот rumit7 умничка написал кодом про неймспейсы то, что я вылила в потоке сознания ))) |
| Автор: rumit7 2.12.2011, 14:33 | ||
..только вот у Вас как всегда лучше получилось.. |
| Автор: baldina 2.12.2011, 17:37 | ||
решаемо
|
| Автор: newbee 2.12.2011, 18:13 |
| Ты руками сделал форвард-декларацию, так нечестно, топик о другом. |
| Автор: baldina 3.12.2011, 22:17 |
| форвард есть, сжульничал. хотел показать что к глобальному namspace доступ можно получить |
| Автор: _GRIN_ 8.12.2011, 03:51 | ||||||||
| baldina, gcc твой пример не компилит - гляди лог: исходник:
попытка компиляции:
Но если работать не со статик-переменными, то всё работает =)
|
| Автор: _GRIN_ 8.12.2011, 04:07 |
| rumit7, спасибо за ссылку в стандарте =) newbee, и тебе спасибо baldina, и тебе =) Тема закрыта |
| Автор: baldina 8.12.2011, 10:16 |
ну так саму переменную где-то определить надо http://liveworkspace.org/code/fadab919a60a031828789c3d6b4e8c83 |