C++에서 클래스 및 함수 정의를 익명 네임 스페이스 내에 래핑하여 내부 연결을 지정합니다. 명시 적으로 템플릿을 인스턴스화 할 수도 있지만 템플릿의 명시적인 인스턴스화를 따르는 표준이 동일한 네임 스페이스에서 발생해야합니다. AFAICT이 컴파일해야하지만, GCC는 실패 : 오류로익명 네임 스페이스가 모든 네임 스페이스를 포함합니까?
namespace foo {
template<class T>
class bar {};
}
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
:
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace 'foo')
익명 네임 스페이스 그냥 정말 네임 스페이스 역할을, 연결을 지정해야하기 때문에 재미있다, 그리고 전역 네임 스페이스는 모든 네임 스페이스를 둘러싸 기 때문에 foo를 확실히 묶습니다. 그러나 심지어이 작동하지 않습니다! :
template<class T>
class bar {};
using namespace foo;
namespace {
template class bar<int>;
}
int main()
{
return 0;
}
단지 대신 글로벌 네임 스페이스를 나열 같은 오류와 함께 실패 어떤 :
namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace '::')
:/
어떤 버전의 GCC - 또는 어떤 컴파일러 옵션 - 또는 어떤 플랫폼입니까? MacOS X에서 G ++ 4.0.1을 사용하는 첫 번째 샘플을 -Wall을 포함하거나 포함하지 않고 시도해 보았습니다. 불만이나 경고없이 컴파일되었습니다. –
Solaris의 GCC 4.2 –