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

时间:2012-05-22 00:39:09

标签: 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

1 个答案:

答案 0 :(得分:1)

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

namespace a {
namespace b {

    template<typename T>
    class x;

    namespace c {

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

    }
}}