S>А что здесь такого? Ну юнит тесты могу потребовать этого) или какая отладочная информация. мне когда-то хотелось выводить в отладочную информацию размер выделенного буфера в deque.
лучше ставить #ifdef UNITTEST в хедере
S>Вообще политика с приватными полями, имхо, слишком жесткая. сделали бы какой нибудь public_cast и все.
private поля дают компилятору больший простор для оптимизации (потому что известно чем ограничен доступ к ним), а public_cast разрушил бы эту возможность
автор прав, код работает (должен работать) благодаря 14.7.2/8
The usual access checking rules do not apply to names used to specify explicit instantiations. [Note: In particular,
the template arguments and names used in the function declarator (including parameter types, return
types and exception specifications) may be private types or objects which would normally not be accessible
and the template may be a member template or member function which would not normally be accessible.]
Здравствуйте, ononim, Вы писали:
O>Откуда такое неуемное стремление прострелить себе ногу?
А что здесь такого? Ну юнит тесты могу потребовать этого) или какая отладочная информация. мне когда-то хотелось выводить в отладочную информацию размер выделенного буфера в deque.
Вообще политика с приватными полями, имхо, слишком жесткая. сделали бы какой нибудь public_cast и все.
Здравствуйте, Sir-G, Вы писали:
KO>>автор прав, код работает (должен работать) благодаря 14.7.2/8 SG>Спасибо большое!!! Мой изначальный вопрос полностью разрешился. SG>Правда возник другой. Зачем сделали такое отступление. Но видимо иногда нужно...
Это, похоже, следствие из 14.7.2/5
An explicit instantiation of a class or function template specialization is placed in the namespace in which
the template is defined...
Если бы при явном воплощении шаблонов проверялись модификаторы доступа, не было бы возможности делать явное воплощение для закрытых членов класса. Могли бы, наверно, разрешить явное воплощение внутри декларации класса, но это, практически, убило бы всю идею: компилятору пришлось бы воплощать шаблоны каждый раз, как он видит декларацию такого класса.
Автор статьи утвержает, что его метод делает все по стандарту. Загрузив в MSVC, я обнаружил, что его код не комплируется. Кто не прав — автор или компилятор? Ошибка компиляции такая:
error C2248: 'A::f' : cannot access private member declared in class 'A'
Здравствуйте, ononim, Вы писали:
O>Откуда такое неуемное стремление прострелить себе ногу?
Это чисто теоретический интерес. Для более глубокого понимания языка. =)
Собственно меня интересует, почему возможен доступ к приватному методу извне класса A (а точнее, в шаблоне аргумента другого класса rob). Есть ли специальное правило на этот счет в стандарте?
KO>автор прав, код работает (должен работать) благодаря 14.7.2/8
Спасибо большое!!! Мой изначальный вопрос полностью разрешился.
Правда возник другой. Зачем сделали такое отступление. Но видимо иногда нужно...
Здравствуйте, k.o., Вы писали:
SG>>Правда возник другой. Зачем сделали такое отступление. Но видимо иногда нужно... KO>Если бы при явном воплощении шаблонов проверялись модификаторы доступа, не было бы возможности делать явное воплощение для закрытых членов класса. Могли бы, наверно, разрешить явное воплощение внутри декларации класса, но это, практически, убило бы всю идею: компилятору пришлось бы воплощать шаблоны каждый раз, как он видит декларацию такого класса.
Я вообще никогда не использовал явное инстанциирование. Но дело не в этом, а то что я не могу придумать полезный пример именно для приватных членов. Хотя наверно он есть (раз уж такой пункт есть), интересно было бы на него взглянуть.
Здравствуйте, Sir-G, Вы писали:
SG>Здравствуйте, k.o., Вы писали:
SG>>>Правда возник другой. Зачем сделали такое отступление. Но видимо иногда нужно... KO>>Если бы при явном воплощении шаблонов проверялись модификаторы доступа, не было бы возможности делать явное воплощение для закрытых членов класса. Могли бы, наверно, разрешить явное воплощение внутри декларации класса, но это, практически, убило бы всю идею: компилятору пришлось бы воплощать шаблоны каждый раз, как он видит декларацию такого класса.
SG>Я вообще никогда не использовал явное инстанциирование. Но дело не в этом, а то что я не могу придумать полезный пример именно для приватных членов. Хотя наверно он есть (раз уж такой пункт есть), интересно было бы на него взглянуть.
Польза ровно такая же как и для любого другого случая явного воплощения. Например, если у тебя closed-source библиотека можно использовать шаблонные классы не раскрывая их реализации.
KO>Польза ровно такая же как и для любого другого случая явного воплощения. Например, если у тебя closed-source библиотека можно использовать шаблонные классы не раскрывая их реализации.