Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何与父命名空间中的模板类成为朋友?_C++_Templates_Namespaces_Visual Studio 2005_Visual C++ 2005 - Fatal编程技术网

C++ 如何与父命名空间中的模板类成为朋友?

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,导致循环包含。一个黑客解决方法:如果您知道模板将实例化的所有特定类型,请与每个实例化

我正在努力使我的类成为其父命名空间中模板的朋友。有人能解释一下我做错了什么吗:

以下是我在MSVC8(Visual Studio 2005)中的尝试及其错误:


错误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>;
            ...
        };

    }
}}