Почему нельзя полностью квалифицировать имена членов?
От: Аноним  
Дата: 10.09.07 11:43
Оценка:
Возможно вы также как и я пользуются стилем называния членов класса в виде m_<реальное название>, дабы избежать "конфликта имён" (я имею ввиду запутывания читающего/дабажущего) в ситуациях а-ля:
struct test
{
   test( int val ) : val( val ) {}
   int val;
}


Т.е. если использовать вместо val m_val в качестве члена, то вроде все становится чётче, приятнее и т.д. Но, мне лично не очень нравятся разного рода префиксы, поэтому сразу же возникает желание написать:
struct test
{
   test( int val ) : test::val( val ) {}
   int val;
}

Что вроде-бы еще лучше всяких там префиксов. Но, тут мне на пути стал компилятор — напрочь отказывается, говорит: "error C2039: 'val' : is not a member of 'test'" (MS VS). Эта ошибка компиляции понятно исчезает от простого добавления вместо полной квалификации имени префикс (или использовав код из первого примера).

В чем же здесь проблема, что стало причиной запрещения полной квалификации имён в списке инициализации (ведь это же просто дополнительная информация, которую компилятор мог попросту сигнорировать, вроде)?

П.С. Понятно, что можно вместо "m_" любую другую технику названия членов, которая позволит их отличать от аргументов, но на проблему это не влияет.
Re: Почему нельзя полностью квалифицировать имена членов?
От: remark Россия http://www.1024cores.net/
Дата: 10.09.07 11:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В чем же здесь проблема, что стало причиной запрещения полной квалификации имён в списке инициализации (ведь это же просто дополнительная информация, которую компилятор мог попросту сигнорировать, вроде)?


Видимо, группа стандартизации *не* исходила из принципа, что надо разрешить всё, для чего не нашли причин к запрещению...


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Почему нельзя полностью квалифицировать имена членов?
От: jazzer Россия Skype: enerjazzer
Дата: 10.09.07 15:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В чем же здесь проблема, что стало причиной запрещения полной квалификации имён в списке инициализации (ведь это же просто дополнительная информация, которую компилятор мог попросту сигнорировать, вроде)?


Да там нет запрета.
Просто грамматика списка инициализации такова, что с квалификацией здесь может выступать только тип:
mem-initializer-id:
  ::(opt) nested-name-specifier(opt) class-name
  identifier


Вот комо высказывается несколько определеннее:
"ComeauTest.c", line 3: error: class "test" has no member class "val"
     test( int val ) : test::val( val ) {}
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.