c++ - 我如何与父 namespace 中的模板类成为 friend ?

标签 c++ templates namespaces visual-studio-2005 visual-c++-2005

我努力让我的类成为其父命名空间中模板的友元。有人可以解释我做错了什么吗:

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


namespace a {
namespace b {

    template<typename T>
    class x;

    namespace c {

        class y
        {
            template<typename T>
            friend class x;
            ...
        };

    }
}}

错误 C2888:a::b::x:无法在命名空间 c 中定义符号


namespace a {
namespace b {

    template<typename T>
    class x;

    namespace c {

        class y
        {
            template<typename T>
            friend class ::a::b::x;
            ...
        };

    }
}}

错误 C2888:a::b::x:无法在命名空间 c 中定义符号


namespace a {
namespace b {

    namespace c {

        class y
        {
            template<typename T>
            friend class ::a::b::x;
            ...
        };

    }
}}

错误 C2039:x:不是 a::b 的成员


我不能只包含包含 class x 的头文件,因为它依赖于 class y 导致循环包含。

最佳答案

黑客解决方法:如果您知道模板将被实例化的所有特定类型,请与每个实例化而不是模板为友。例如:

namespace a {
namespace b {

    template<typename T>
    class x;

    namespace c {

        class y
        {
            friend class x<char>;
            friend class x<wchar_t>;
            ...
        };

    }
}}

关于c++ - 我如何与父 namespace 中的模板类成为 friend ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694416/

相关文章:

c++ - 可变参数模板参数转发使用逗号运算符

XML、 namespace 和 E4X

C++ 恢复流 fmtflags

c# - 如何更改菜单的文本颜色?

c++ - 从 std::thread 访问类变量

c++ - 整数常量与类型的偏特化

c++ - 无法理解 C++ 中的可变参数模板

c++ - 如何在Excel编程中使用 "Find"函数?

javascript - 为什么我不能在 jQuery(document).ready() 中调用我的 namespace ?

c# - 使用 c# 向 asp.net 中所有新创建的页面添加新的命名空间