> > в MS Visual Studio 6.0 компиляется нормально, а вот в .NET выдает следущее > > c:\Work\temp\krol.cpp(11): error C3767: 'nativeCall_at' matching function is not accessible > > Скажи почему? код не мой и почему так сделано я не знаю, и хотелось бы узнать что это за конструкция такая хитрая и почему так сделано.
friend функция определенная внутри класса может быть найдена компилятором только при помощи argument dependent name lookup, т.е. такая ф-ция обязана иметь объект/ссылку/указатель этого класса в качестве одного из своих аргументов.
-- Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re: код не компиляется в .NET но компиляется в 6.0
В программе ошибка. Не уверен, что мои объяснения будут полезными (они актуальны для гипотетического "правильного компилятора") — такого
объявления(и определения) функции-друга в твоем случае — недостаточно, чтоб вызывать. По стандарту объявление друга не добавляет ВИДИМОГО объявления
функции в охватывающую класс область видимости (хотя всякие проверки этого объявления выполняются). Найти его можно при помощи АДЛ (это если у функции
будут параметры типа класса, в котором ты ее другом объявил), ну либо объяви ее перед классом, а потом еще и другом в классе.
Сорри за топорность объяснения
Of course, the code must be complete enough to compile and link.
Re[2]: код не компиляется в .NET но компиляется в 6.0
int nativeCall_at();
class NativeCall {
friend int nativeCall_at() { return v; }
static void is_call_to() {
nativeCall_at();
}
static int v;
};
Любите книгу — источник знаний (с) М.Горький
Re[2]: код не компиляется в .NET но компиляется в 6.0
От:
Аноним
Дата:
27.07.05 12:37
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>В программе ошибка. Не уверен, что мои объяснения будут полезными (они актуальны для гипотетического "правильного компилятора") — такого L_L>объявления(и определения) функции-друга в твоем случае — недостаточно, чтоб вызывать. По стандарту объявление друга не добавляет ВИДИМОГО объявления L_L>функции в охватывающую класс область видимости (хотя всякие проверки этого объявления выполняются). Найти его можно при помощи АДЛ (это если у функции L_L>будут параметры типа класса, в котором ты ее другом объявил), ну либо объяви ее перед классом, а потом еще и другом в классе.