C++ 另一命名空间和CRTP中的模板友元函数

C++ 另一命名空间和CRTP中的模板友元函数,c++,C++,在过去的几个小时里,这让我发疯,我似乎无法回避这个问题。我将问题归结为这60行代码(包括一个主函数) #包括 名称空间n1{ //一般定义 模板无效f(X&,常数Y&) { std::cout您的类定义必须如下所示: template <class Derived> class A { int data; template <class D, class Y> friend void n1::f(A<D>& a, const Y&am

在过去的几个小时里,这让我发疯,我似乎无法回避这个问题。我将问题归结为这60行代码(包括一个主函数)

#包括
名称空间n1{
//一般定义
模板无效f(X&,常数Y&)
{

std::cout您的类定义必须如下所示:

template <class Derived> class A 
{
    int data;
    template <class D, class Y> friend void n1::f(A<D>& a, const Y& y);
};
模板类别A
{
int数据;
模板n1::f(A&A,常数Y&Y);
};
实际上,函数声明是:

template <class Derived, class Y> void f(n2::A<Derived>& a, const Y& y) 
template <class Y> friend void n1::f(A<Derived>& a, const Y& y); 
模板空f(n2::A&A,常数Y&Y)
而您的好友声明是:

template <class Derived, class Y> void f(n2::A<Derived>& a, const Y& y) 
template <class Y> friend void n1::f(A<Derived>& a, const Y& y); 
n1::f(A&A,const Y&Y);
在本例中,它们是不同的野兽,这就是您收到该错误的原因。正如您所看到的,模板参数列表是不同的。这不是一个单独定义的函数声明。它们是两个不同的函数模板,一个声明,另一个声明和定义。
换句话说,您在代码中声明了一个friend函数,但从未定义过它。另一方面,您引入了一个免费函数模板,该模板无法读取
数据
成员,因为它是私有的,并且该函数不是
中的friend函数



看到它在运行。

我明白了……这很有效!哇。你能解释为什么需要额外的模板参数
D
吗?在我看来,我的好友声明将使任何
A
成为好友,但似乎你需要一个单独的模板参数。@rwols我添加了更多详细信息。它们是两个不同的函数模板ates,因为它们有不同的模板参数列表和不同的参数。我不知道如何更好地解释它。。。