이 코드는 VS2008에 C2248 : 'A::B::ExceptionB' : cannot access private class declared in 'class A::B'
을 생성합니다. 내가 B
에서 클래스 ExceptionB{}
대중을하면 물론컴파일러가 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;
}
}
은, 코드 컴파일합니다.
그러나 A::ExceptionA
가 A
에서 개인 클래스이고 A::B::ExceptionB
가 A::B
에서 개인 클래스로 컴파일러, main()
에서 2 개 캐치 조항에 대해 불평 does't 왜 이해가 안 돼요.
네 말이 맞아. 'catch (A :: ExceptionA &)'를'catch (A :: ExceptionA & a)'로 바꾸면 컴파일러가 불평합니다. 표준에서 15.6 장을 언급했지만, 적어도 표준 최신 초안 N3225에서는 찾을 수 없습니다. 15.6 1 항을 확인할 수 있습니까? – Belloc
@ user1042389 : C++ 03을보고 있습니다. –
감사합니다. 나는 당신에게 대답에 대한 크레딧을주고 있습니다. – Belloc