код не компиляется в .NET но компиляется в 6.0
От: Аноним  
Дата: 27.07.05 11:54
Оценка:
Привет!

вот код


class NativeCall {

  friend int nativeCall_at() {
    return v;
  }

  static void is_call_to() {
      nativeCall_at();
  }

  static int v;
};


в MS Visual Studio 6.0 компиляется нормально, а вот в .NET выдает следущее

c:\Work\temp\krol.cpp(11): error C3767: 'nativeCall_at' matching function is not accessible

Скажи почему? код не мой и почему так сделано я не знаю, и хотелось бы узнать что это за конструкция такая хитрая и почему так сделано.
Re: код не компиляется в .NET но компиляется в 6.0
От: Аноним  
Дата: 27.07.05 11:57
Оценка:
А>Скажи почему?

тоесть скажите пожалуйста

описался немного, извиняюсь
Re: код не компиляется в .NET но компиляется в 6.0
От: MaximE Великобритания  
Дата: 27.07.05 12:07
Оценка:
wrote:

> Привет!

>
> вот код
>
>
>
> class NativeCall {
>
>   friend int nativeCall_at() {
>     return v;
>   }
>
>   static void is_call_to() {
>       nativeCall_at();
>   }
>
>   static int v;
> };
>
>

>
> в 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
От: Lorenzo_LAMAS  
Дата: 27.07.05 12:08
Оценка:
В программе ошибка. Не уверен, что мои объяснения будут полезными (они актуальны для гипотетического "правильного компилятора") — такого
объявления(и определения) функции-друга в твоем случае — недостаточно, чтоб вызывать. По стандарту объявление друга не добавляет ВИДИМОГО объявления
функции в охватывающую класс область видимости (хотя всякие проверки этого объявления выполняются). Найти его можно при помощи АДЛ (это если у функции
будут параметры типа класса, в котором ты ее другом объявил), ну либо объяви ее перед классом, а потом еще и другом в классе.

Сорри за топорность объяснения
Of course, the code must be complete enough to compile and link.
Re[2]: код не компиляется в .NET но компиляется в 6.0
От: Lorenzo_LAMAS  
Дата: 27.07.05 12:09
Оценка:
вот только у него — то вижуал, которому вроде чхать на это правило (да и вообще кроме комо всем чхать)
Of course, the code must be complete enough to compile and link.
Re[3]: код не компиляется в .NET но компиляется в 6.0
От: MaximE Великобритания  
Дата: 27.07.05 12:12
Оценка:
Lorenzo_LAMAS wrote:

> вот только у него — то вижуал, которому вроде чхать на это правило (да и вообще кроме комо всем чхать)


Проверил на g++ 4.0.0 — действительно чхать

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[4]: код не компиляется в .NET но компиляется в 6.0
От: Lorenzo_LAMAS  
Дата: 27.07.05 12:14
Оценка:
Дак мы это раз 10 обсуждали Только я не помню, нормативная ли это часть стандарта, или сказано в примечании.
Of course, the code must be complete enough to compile and link.
Re: код не компиляется в .NET но компиляется в 6.0
От: Bell Россия  
Дата: 27.07.05 12:15
Оценка:
Здравствуйте, Аноним, Вы писали:

Победить можно так:

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>будут параметры типа класса, в котором ты ее другом объявил), ну либо объяви ее перед классом, а потом еще и другом в классе.


Это все объясняет, спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.