C++ 如何与父命名空间中的模板类成为朋友?
我正在努力使我的类成为其父命名空间中模板的朋友。有人能解释一下我做错了什么吗: 以下是我在MSVC8(Visual Studio 2005)中的尝试及其错误:C++ 如何与父命名空间中的模板类成为朋友?,c++,templates,namespaces,visual-studio-2005,visual-c++-2005,C++,Templates,Namespaces,Visual Studio 2005,Visual C++ 2005,我正在努力使我的类成为其父命名空间中模板的朋友。有人能解释一下我做错了什么吗: 以下是我在MSVC8(Visual Studio 2005)中的尝试及其错误: 错误C2888:a::b::x:无法在命名空间c 名称空间a{ 命名空间b{ 命名空间c{ y类 { 模板 朋友类::a::b::x; ... }; } }} 错误C2039:x:不是a::b的成员 我不能只包含包含类x的头文件,因为它依赖于类y,导致循环包含。一个黑客解决方法:如果您知道模板将实例化的所有特定类型,请与每个实例化
错误C2888:
a::b::x
:无法在命名空间c
名称空间a{
命名空间b{
命名空间c{
y类
{
模板
朋友类::a::b::x;
...
};
}
}}
错误C2039:x
:不是a::b的成员
我不能只包含包含类x
的头文件,因为它依赖于类y
,导致循环包含。一个黑客解决方法:如果您知道模板将实例化的所有特定类型,请与每个实例化而不是模板交朋友。例如:
namespace a {
namespace b {
template<typename T>
class x;
namespace c {
class y
{
friend class x<char>;
friend class x<wchar_t>;
...
};
}
}}
名称空间a{
命名空间b{
模板
x类;
命名空间c{
y类
{
x类朋友;
x类朋友;
...
};
}
}}
,必须是编译器是哑的。适用于clang 3.1
、g++4.6.2
和VS 2008
。你能试着编译@SethCarnegie在他与MS VS 2005的链接中发布的测试程序吗?看起来编译器中有一个bug…@SethCarnegie的测试程序给了我错误C2888:'a::b::x':无法在命名空间“c”中定义符号。
不理想。如果我完全定义类x
而不是仅仅声明它,它甚至不起作用。@你考虑过更新你的编译器吗?@SethCarnegie:如果可以的话,我会的。它是最新的版本,不会(无意中)阻止二进制文件在旧版本的Windows上运行。有一天我们希望在MinGW中使用GCC,但不是今天。
namespace a {
namespace b {
template<typename T>
class x;
namespace c {
class y
{
template<typename T>
friend class ::a::b::x;
...
};
}
}}
namespace a {
namespace b {
namespace c {
class y
{
template<typename T>
friend class ::a::b::x;
...
};
}
}}
namespace a {
namespace b {
template<typename T>
class x;
namespace c {
class y
{
friend class x<char>;
friend class x<wchar_t>;
...
};
}
}}