0

我正在努力让我的班级成为其父命名空间中模板的朋友。有人可以解释我做错了什么:

以下是我在 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导致循环包含。

4

1 回答 1

1

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

namespace a {
namespace b {

    template<typename T>
    class x;

    namespace c {

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

    }
}}
于 2012-05-22T01:32:58.743 回答