Мне просто удалось обнаружить, что доступ к закрытому классу частного шаблона можно получить непосредственно за пределами закрывающего класса с помощью директивы using
:
class wrapper
{
private:
template <typename T>
class __tklass {};
class __klass {};
};
template <typename T>
using tklass = wrapper::__tklass<T>; // Expected error but compiles OK
// using klass = wrapper::__klass; // "Error: __klass is private"
int main()
{
tklass<int> v1; // Expected error but compiles OK
// wrapper::__tklass<int> v3; // "Error: __tklass is private"
// wrapper::__klass v4; // "Error: __klass is private"
}
Строки с пометкой "Ошибка: __xxx является конфиденциальной" правильно сообщают об ошибке при раскомментировании. Но строки с tklass
скомпилированы без каких-либо претензий от компилятора.
Итак, почему именно флаг компилятора tklass
как ошибка, несмотря на то, что wrapper::__tklass
является закрытым? Возможно ли это по стандарту? Если это так, разве это не считается серьезным нарушением прав доступа?
Я попробовал это на gcc-4.9.2, clang-3.5.0 и visual studio 2013 express. Командная строка GCC:
g++ -std=c++11 -pedantic -Wall -Wextra -Wshadow myfile.cpp