当前位置: 首页 > 知识库问答 >
问题:

将模板函数声明为friend

程墨竹
2023-03-14

我有一个全局函数是这样的:

namespace X
{
namespace Y
{
template <R, ...T>
R foo(T&&... args)
{
    R r(args...);
    return r;
}
}
}

然后在另一个类A中,我要将这个函数foo声明为A的朋友。所以我做了:

class A
{
template <R, ...T>
friend R X::Y::foo(T&&... args);
A(int x, int y){}
};

现在,当我调用x::y::foo(4,5)时,它无法编译,错误是foo无法访问a的私有构造函数。我无法理解该错误,如何正确声明fooa的朋友?

提前道谢。


共有1个答案

邵刚洁
2023-03-14

在修复了模板参数和参数包的语法问题之后,这似乎起作用了:

namespace X
{
    namespace Y
    {
        template <typename R, typename ...T>
        R foo(T&&... args)
        {
            R r(args...);
            return r;
        }
    }
}

class A
{
    template <typename R, typename ...T>
    friend R X::Y::foo(T&&... args);
    A(int x, int y){}
};

int main()
{
    X::Y::foo<A>(1, 2);
}

这里是上述代码编译的一个实例。

 类似资料:
  • 本题部分基于加速C++[1]中的练习15-4和那本书中的代码。我想将函数声明为类的朋友,以便它能够访问私有成员。函数被声明为模板,但我不想让所有可能的函数访问私有成员,只允许那些与该类关联的函数访问。 其他文件: 另一个假设的函数可以调用对象的方法,但我希望限制对的私有访问。有没有办法做到这一点,还是我想多了,这种情况在实践中永远不会发生?我应该使用模板专门化吗? [1]Koenig,A.和Moo

  • 我有一个类模板和一个函数模板定义了一个,它引用要绑定到的模板类型。 我想要的是将< code>make_obj函数声明为< code>friend,这样它可以创建< code>Obj的,但是其他人不能(除了通过copy ctor)。 我尝试了几个朋友声明,包括 和 后者是使< code>make_obj的所有模板实例化成为< code>Obj类的朋友的不太理想的尝试。然而,在这两种情况下,我得到相

  • 我发现以下错误: 错误:变量或字段“foo”声明为void 错误:“a”之前应为“)” 错误:在'b'之前预期')' 在函数“int main()”中:错误:“foo”未在此范围内声明

  • 问题内容: 目前,我正在研究Sams出版的《 24小时自学Android应用程序开发》一书。我是Java,Android或其他方面的新手。我在ActionScript 3中具有非常扎实的背景,该语言与Java具有足够的相似性,因此该语言本身并不难掌握,但对于本书中某些代码示例的基本原理,我仍然存在一些疑问。例如,以下是第9小时的示例代码随附的函数: 在此函数签名中,作者已将scoreTable参数

  • 模板特化可以被显式声明,这可以作为消除多重实例化的一种方式。例如: #include "MyVector.h" extern template class MyVector<int>; // 消除下面的隐式实例化 // MyVector 类将在“其他地方”被程序员显式实例化 void foo(MyVector<int>& v) { //在这个地方使用vector类型 } 下列代码就是上例