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
}
};
}
有人可以帮我修复我的第一个代码中的错误吗?非常感谢你。
答案 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}}