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
模板不同的模板,因为它采用不同的参数