template <class T,int N> void h(T const(&)[N]);作为朋友功能

时间:2019-10-28 21:28:15

标签: c++ templates c++17 friend

有一个独立的函数(非成员函数)定义为:

template<class T, std::size_t N> 
auto foo(T const(&init)[N]) { /* ... */ }

foo()用于推导N(数组大小)

此外,在同一个命名空间中,有一个类定义为:

class Bar {

friend auto foo( Bar const(&)[/* ??? */] ); /* <-------- The goal to make it right */

private:
    Bar( void ) { /* ... */ }
};

我的问题是我还没有成功将foo()声明为Bar类的朋友,以便它可以访问私有成员。

foo()声明中,有std::size_t N模板参数。但是如何建立所有N个值的友谊?

在此先感谢任何愿意提供帮助的人。

马丁

1 个答案:

答案 0 :(得分:2)

您的第一个声明声明foo是模板的名称。没有名为foo function 。从名为foo的模板生成的函数将具有类似foo<T, N>的名称,其中T是类型名称,N是整数。

您的朋友声明声明应该有一个foo,它是一个函数的名称。这与模板名称foo不符。

如果您想声明Bar将允许形式为foo的{​​{1}}模板的任何实例访问其私有数据……那么,您不能。您可以声明模板生成的任何内容的朋友:

foo<Bar, *>

您可以声明特定模板实例与之的友谊:

template<typename T, std::size_t N>
friend auto foo( T const(&)[N] );

但是您不能将其声明为模板生成函数中只有 some 个朋友。如果您尝试过这样的事情:

friend auto foo<Bar, 20>( Bar const(&)[20] );

您会发现原来的template<std::size_t N> friend auto foo(Bar const(&init)[N]); 无法访问它。这是指与foo模板不同的模板,因为它采用了不同的参数。