C++ 模板<;T类,内部N>;空h(T常数(&;)[N]);作为朋友函数
独立功能(非成员功能)定义为:C++ 模板<;T类,内部N>;空h(T常数(&;)[N]);作为朋友函数,c++,templates,c++17,friend,C++,Templates,C++17,Friend,独立功能(非成员功能)定义为: template<class T, std::size_t N> auto foo(T const(&init)[N]) { /* ... */ } class Bar { friend auto foo( Bar const(&)[/* ??? */] ); /* <-------- The goal to make it right */ private: Bar( void ) { /* ... */ } }
template<class T, std::size_t N>
auto foo(T const(&init)[N]) { /* ... */ }
class Bar {
friend auto foo( Bar const(&)[/* ??? */] ); /* <-------- The goal to make it right */
private:
Bar( void ) { /* ... */ }
};
模板
自动foo(T常量(&init)[N]){/*…*/}
foo()用于推导N(数组大小)
此外,在同一命名空间中,有一个类定义为:
template<class T, std::size_t N>
auto foo(T const(&init)[N]) { /* ... */ }
class Bar {
friend auto foo( Bar const(&)[/* ??? */] ); /* <-------- The goal to make it right */
private:
Bar( void ) { /* ... */ }
};
类栏{
friend auto-foo(Bar const(&)[/*???*/]));/*您的第一个声明声明foo
是模板的名称。没有名为foo
的函数。从名为foo
的模板生成的函数将具有类似foo
的名称,其中T
是类型名称,N
是整数
您的好友声明声明应该有一个foo
,它是函数的名称。这与模板的名称foo
不匹配
如果您想声明Bar
将允许对foo
表单的foo
模板的任何实例化来访问其隐私…那么,您不能。您可以声明模板生成的任何内容的好友:
template<typename T, std::size_t N>
friend auto foo( T const(&)[N] );
模板
friend auto-foo(T常量(&)[N]);
您可以声明与特定模板实例化的关系:
friend auto foo<Bar, 20>( Bar const(&)[20] );
friend auto foo(Bar const(&)[20]);
但是,您不能仅将其声明为某些模板生成函数的朋友。如果您尝试以下操作:
template<std::size_t N>
friend auto foo(Bar const(&init)[N]);
模板
friend auto-foo(Bar const(&init)[N]);
您会发现原始的foo
无法访问它。这是指与foo
模板不同的模板,因为它采用不同的参数