首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造函数/赋值算子的构造方法

构造函数/赋值算子的构造方法
EN

Stack Overflow用户
提问于 2017-11-04 21:13:11
回答 1查看 91关注 0票数 1

我一直在处理一个模板化类型,它只应该是复制/移动可构造/可在另一个特定类型的自己的赋值/构造中分配的类型。(试图防止面向用户的代码中的细微错误)

另一种类型是模板参数中的ty胡枝子,因此,为了保存类型,我在类定义中使用了另一种类型。相关实施双边投资条约:

代码语言:javascript
复制
template<typename Info>
class Foo {
  using T = typename Info::some_t;
  Foo(const Foo&) = default;
  Foo& operator=(const Foo&) = default;
  // ...
public:
  Foo() = default;
  // ...
};

我不能使用普通的friend class T;语句,因为我不希望T可以访问。作为另一种选择,让相关的赋值运算符和构造器成为朋友似乎是可行的。我相信您可以通过friend X::X(...);使另一种类型的构造函数成为朋友,并且我假设friend X::operator=(...);也是有效的。但是,试图在Foo中写入friend T::T(const T&);会触发编译器错误。我也尝试过其他构造函数类型和赋值运算符,但都没有成功。

MSVC警告说,“T”:相关名称不是类型,参数中标识符T上的错误。它建议将typename放在T之前,这将删除警告,但仍会在参数列表中的T上出现错误。(尽管消息略有不同)是否有一个有效的语法来执行此操作?或者,还有其他方式来执行我的目标限制吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-05 09:44:54

您不能使用typedef名称来声明构造函数。标准明确禁止在class.ctor. this /1中这样做:

类名不应是类型胡枝子名.

如果您使用与(内部)类名相一致的ty胡枝子名称,则可以在以下几个方面进行工作:

代码语言:javascript
复制
using some_t = typename Info::some_t;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47115694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档