在c ++

时间:2018-05-05 18:28:23

标签: c++

namespace N
{
    template<typename tname> class C
    {
    public:
            friend void f(int, C<tname>);
    };
}

template<typename tname>
    void N::f(int, N::C<tname>)
    {   
    }

我正在创建一个朋友函数f,但编译器告诉我这个错误:

'f': is not a member of N.

同时,如果没有命名空间,我的代码将运行正确。

当我使用普通类而不是泛型类(没有删除命名空间)时,我的代码也是正确的。

完全声明也没有错误。如下面的代码:

namespace N
{
    template<typename tname> class C
    {
    public:
        friend void f(int, C<tname>)
        {
            //mycode
        }
    };
} 

有人可以帮我修复我的第一个代码中的错误吗?非常感谢你。

1 个答案:

答案 0 :(得分:2)

friend声明并不意味着该函数现在是该类的成员。这仅表示f可以访问C的私人成员。

因此,如果f位于全局命名空间中,则无法将N引用为N::f内的::f,即使在朋友之后,它仍然只是f声明。

在第二个示例中,您将namespace N { template<typename tname> class C; template<typename tname> void f(int, C<tname>); template<typename tname> class C { public: friend void f(int, C<tname>); }; } template<typename tname> void N::f(int, N::C<tname>) { } int main() { } 声明为成员函数,并将其声明为朋友,我不确定是否有用。

以下编译:

{{1}}