Я пытаюсь использовать проект с открытым исходным кодом. И последняя официальная (из файла * .tar.gz), и новейшая (из SVN-репозитория) версии имеют такие вещи:
class Type1 {
friend class Ridiculous;
friend class Number;
friend class Of_Friends;
int ImportantPrivateSemiSharedData;
};
// In another header...
class Ridiculous {
class Inner {
void MyFunc( Type1 &t )
{ /*do something with t.ImportantPrivateSemiSharedData*/ }
};
};
AFAIK, маркировка class A
как friend
из class B
означает , а не дает любой тип, связанный с A
friend
правами судна с B
. Ни классы, производные от A
, ни классы friend
, имеющие A
, не получают friend
с B
. Я думаю, что это ограничение относится и к внутренним классам.
Я использую компьютер с 2002 года, вернувший несколько версий операционной системы назад, в то время как программа (и, вероятно, ее команда разработчиков) в основном работает на более новых компьютерах. Мой системный компилятор просто старый и сломанный, или компиляторы new-hotness допускают что-то, чего они не должны? Это изменение в C ++ 11?
Я просто хочу использовать эту программу, но продолжаю зацикливаться на таких вещах. Я уже подозрительно, потому что код полон методов, таких как «личные данные со смешным количеством друзей» и «внутренние классы везде», которые, я думаю, являются запахами кода. Команда использует эти методы вместе, но я думаю, что они в корне несовместимы, так как friend
корабль не переносит, и вы не можете заранее объявить внутренние классы.
(Если это необходимо, я использую 32-битную Mac OS X Tiger 10.4.11 / PowerPC (eMac с G4). Программа LLVM и CLang (и LLVM Test Suite), которые пробуют с обоих v3 .0 и r153311 от Subversion. Компилятор - это GCC 4.0.1, поставляемый Apple, с XCode 2.5.)
Добавление
Видя первые ответы, теперь я подозреваю, что пометка класса как друга имеет две интерпретации. Учитывая, что class A
содержит friend class X
, это объявление может предоставить доступ к:
- функция-член (
static
или специальная или ни одна) из X
.
- любая функция, включая специальные, чье полное имя имеет
полное имя
X
в качестве префикса.
Я думаю, что мой компилятор использует первое определение, а компилятор авторов использует второе. Было ли официальное слово, какое толкование является правильным? Если да, когда появилась спецификация (C ++ 98/03, отчет о дефектах, C ++ 11)? Я всегда думал, что дружба означает первую версию (включая материал C ++, который я прочитал); второй никогда не приходил мне в голову до сих пор.