This question already has answers here:
Access friend function defined in class

(2个答案)


3年前关闭。




这似乎可行:
template<class A> struct S {
    template<class B> friend S<B> f(B);
};

template<class B> S<B> f(B) {return S<B>{};}

int main() {
    f(5);
}

http://ideone.com/lApGTi

好的,让我们做一个看似纯粹的外观更改,然后将f的定义移到struct的主体中:
template<class A> struct S {
    template<class B> friend S<B> f(B) {return S<B>{};}
};

int main() {
    f(5);
}

突然编译开始失败:
prog.cpp: In function ‘int main()’:
prog.cpp:6:5: error: ‘f’ was not declared in this scope
  f(5);
     ^

http://ideone.com/ImsQtJ

为什么需要在类外部定义模板 friend 功能才能在此代码段中工作?

有什么技巧可以在类定义的主体中定义f函数吗?

最佳答案

当您在类内部实现内联函数时,如果没有argument-dependent lookup,则在类外部看不到其声明。

仅当该类或其任何嵌套类使用friend函数时,这才有用。

常规类也存在该问题,而不仅仅是类模板。以下也是一个问题。

struct S {
   friend S f(int) {return S{};}
};

int main() {
   f(5);
}

关于c++ - 如果在类中定义了模板化的 friend 函数,为什么似乎没有公开? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42866338/

10-12 23:58