模板<class T, int N> void h(T const(&)[N]);作为友元函数
template<class T, int N> void h(T const(&)[N]); as friend function
有一个独立函数(非成员函数)定义为:
template<class T, std::size_t N>
auto foo(T const(&init)[N]) { /* ... */ }
foo() 旨在推导出 N(数组大小)
此外,在同一个命名空间中有一个 class 定义为:
class Bar {
friend auto foo( Bar const(&)[/* ??? */] ); /* <-------- The goal to make it right */
private:
Bar( void ) { /* ... */ }
};
我的问题是我尚未成功将 foo()
声明为 Bar class 的好友,以便它可以访问私有成员。
在foo()
声明中,有std::size_t N
模板参数。但是如何让所有N值的友情呢?
非常感谢任何愿意提供帮助的人。
马丁
您的第一个声明声明 foo
是模板的名称。没有名为 foo
的 函数 。从名为 foo
的模板生成的函数将具有类似 foo<T, N>
的名称,其中 T
是类型名称,N
是整数。
你的朋友声明声明应该有一个 foo
这是一个函数的名称。这与模板名称 foo
不匹配。
如果您想声明 Bar
将允许 foo<Bar, *>
形式的 foo
模板的任何实例化来访问其私有...嗯,您不能。您可以声明模板生成的任何对象的好友:
template<typename T, std::size_t N>
friend auto foo( T const(&)[N] );
您可以声明与特定模板实例化的友谊:
friend auto foo<Bar, 20>( Bar const(&)[20] );
但是您不能将它声明为只有 一些 模板生成函数的友元。如果您尝试过这样的操作:
template<std::size_t N>
friend auto foo(Bar const(&init)[N]);
您会发现原来的 foo
无法访问它。这是指与 foo
模板不同的模板,因为它采用不同的参数。
有一个独立函数(非成员函数)定义为:
template<class T, std::size_t N>
auto foo(T const(&init)[N]) { /* ... */ }
foo() 旨在推导出 N(数组大小)
此外,在同一个命名空间中有一个 class 定义为:
class Bar {
friend auto foo( Bar const(&)[/* ??? */] ); /* <-------- The goal to make it right */
private:
Bar( void ) { /* ... */ }
};
我的问题是我尚未成功将 foo()
声明为 Bar class 的好友,以便它可以访问私有成员。
在foo()
声明中,有std::size_t N
模板参数。但是如何让所有N值的友情呢?
非常感谢任何愿意提供帮助的人。
马丁
您的第一个声明声明 foo
是模板的名称。没有名为 foo
的 函数 。从名为 foo
的模板生成的函数将具有类似 foo<T, N>
的名称,其中 T
是类型名称,N
是整数。
你的朋友声明声明应该有一个 foo
这是一个函数的名称。这与模板名称 foo
不匹配。
如果您想声明 Bar
将允许 foo<Bar, *>
形式的 foo
模板的任何实例化来访问其私有...嗯,您不能。您可以声明模板生成的任何对象的好友:
template<typename T, std::size_t N>
friend auto foo( T const(&)[N] );
您可以声明与特定模板实例化的友谊:
friend auto foo<Bar, 20>( Bar const(&)[20] );
但是您不能将它声明为只有 一些 模板生成函数的友元。如果您尝试过这样的操作:
template<std::size_t N>
friend auto foo(Bar const(&init)[N]);
您会发现原来的 foo
无法访问它。这是指与 foo
模板不同的模板,因为它采用不同的参数。