Возможно вы также как и я пользуются стилем называния членов класса в виде 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_" любую другую технику названия членов, которая позволит их отличать от аргументов, но на проблему это не влияет.
Здравствуйте, Аноним, Вы писали:
А>В чем же здесь проблема, что стало причиной запрещения полной квалификации имён в списке инициализации (ведь это же просто дополнительная информация, которую компилятор мог попросту сигнорировать, вроде)?
Видимо, группа стандартизации *не* исходила из принципа, что надо разрешить всё, для чего не нашли причин к запрещению...
Здравствуйте, Аноним, Вы писали:
А>В чем же здесь проблема, что стало причиной запрещения полной квалификации имён в списке инициализации (ведь это же просто дополнительная информация, которую компилятор мог попросту сигнорировать, вроде)?
Да там нет запрета.
Просто грамматика списка инициализации такова, что с квалификацией здесь может выступать только тип:
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 ) {}