Этот код генерирует C2248 : 'A::B::ExceptionB' : cannot access private class declared in 'class A::B'
в VS2008.Почему компилятор не жалуется на предложения catch?
#include <iostream>
class A
{
class ExceptionA{};
class B
{
class ExceptionB{};
public:
B();
};
public:
A(int);
};
A::B::B()
{
throw ExceptionB();
}
A::A(int i)
{
i % 2 ? throw ExceptionA() : throw A::B::ExceptionB(); // C2248 !!
}
int main()
{
try
{
A a(3);
}
catch(A::ExceptionA&)
{
std::cout << "A::ExceptionA" << std::endl;
}
catch(A::B::ExceptionB&)
{
std::cout << "A::B::ExceptionB" << std::endl;
}
}
Конечно, если я делаю класс ExceptionB{}
общественности в B
, код компилируется.
Но я не понимаю, почему компилятор does't жалуются на 2 улове статей в main()
, так как A::ExceptionA
частный класс в A
и A::B::ExceptionB
частный класс в A::B
.
Вы правы. Если я заменил 'catch (A :: ExceptionA &)' на 'catch (A :: ExceptionA & a)' компилятор жалуется. Вы упомянули главу 15.6 в Стандарте, но я не могу ее найти, по крайней мере, в проекте «Стандарт-последний» N3225. Не могли бы вы подтвердить пункт 15.6 пункта 1? – Belloc
@ user1042389: Я смотрю на C++ 03 здесь. –
Спасибо. Я даю вам кредит на ответ. – Belloc