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。 –