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

如何对带约束的模板类使用friend声明

韦阳晖
2023-03-14
template <typename T> concept Constraint = true;

template <Constraint T>
class A { };

struct B {
    template <typename>
    friend class A;
};

这在gcc中编译,但在clang和最新的MSVC预览编译器中都不编译

下一个尝试是使用friend声明中的约束,即。

template <typename T> concept Constraint = true;

template <Constraint T>
class A { };

struct B {
    template <Constraint>
    friend class A;
};

这看起来像是一种自然的方式,因为无论如何只能在满足约束的情况下实例化friend。

template <typename T> concept Constraint = true;

template <Constraint T>
class A { };

struct B {
    template <Constraint U>
    friend class A;
};

共有1个答案

胡元忠
2023-03-14

我很确定这是正确的版本(即您的第二个或第三个选项):

template <typename T> concept Constraint = true;

template <Constraint T>
class A { };

struct B {
    template <Constraint> friend class A;
};

这应该有助于A的所有专门化。typename有错误,因为这与A的声明不匹配。我不认为我们对此有具体的措辞,但这似乎是明确的意图。

gcc和clang都接受这个版本(演示),而compiler-explorer上的MSVC版本根本没有实现概念。

 类似资料:
  • 我有一个全局函数是这样的: 然后在另一个类中,我要将这个函数声明为的朋友。所以我做了: 现在,当我调用时,它无法编译,错误是foo无法访问的私有构造函数。我无法理解该错误,如何正确声明为的朋友? 提前道谢。

  • 在下面的代码中,是一个模板类,取决于非类型参数。为和定义了friend。还依赖于另一个bool模板参数。 在Coliru上看现场直播。 现在,我想给出的模板参数的默认值,例如,以便以下语句 相当于 如果我在 同样,它不编译给出错误 main.cpp:27:15:错误:重新声明friend'template std::ostream&operator<<(std::ostream&,const a&

  • 假设我有一个类模板,

  • 这将使约束在范围内,为提供额外的参数。这里我的意图是包含一些(隐藏的)具体类型,它应该用作多态函数GHC compulins的具体类型: 我的用例的假设是1。同时计算和2。隐藏类型的值涉及(至少部分)第一个元组元素的计算。这意味着我不想在中调用两次(一次是获取,一次是使用该类型绑定第一个元组元素)。在存在约束的情况下,是否有某种方法使的定义成为可能?

  • 根据C标准: 标准布局类是这样的类: -没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员, -没有虚拟函数(10.3),也没有虚拟基类(10.1), -对所有非静态数据成员具有相同的权限改造(第11条),-没有非标准布局基类, -在大多数派生类中没有非静态数据成员,并且最多有一个基类具有非静态数据元素,或者没有基类具有静态数据元素;以及 -没有与第一个非静态数据成员相同类型的基类 宏

  • 本文向大家介绍如何使用JSP声明来声明类的对象?,包括了如何使用JSP声明来声明类的对象?的使用技巧和注意事项,需要的朋友参考一下 声明声明了一个或多个变量或方法,您可以稍后在JSP文件中的Java代码中使用它们。在JSP文件中使用变量或方法之前,必须先声明该变量或方法。 以下是JSP声明的语法- 您可以编写与上述语法等效的XML,如下所示- 以下是JSP声明中对象声明的示例-