【问题标题】:template<class T, int N> void h(T const(&)[N]); as friend function模板<class T, int N> void h(T const(&)[N]);作为朋友功能
【发布时间】:2020-02-24 04:10:51
【问题描述】:

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

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值的友谊呢?

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

马丁

【问题讨论】:

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


    【解决方案1】:

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

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

    如果你想声明Bar 将允许foo 模板的任何实例化foo&lt;Bar, *&gt; 来访问它的私有信息......好吧,你不能。您可以声明模板生成的任何内容的朋友:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多