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 Bar {
friend auto foo( Bar const(&)[/* ??? */] ); /* <-------- The goal to make it right */
private:
Bar( void ) { /* ... */ }
};

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

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

非常感谢任何愿意提供帮助的人。

Martin

您的第一个声明声明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模板不同的模板,因为它使用不同的参数。

相关内容

最新更新