我一直在处理一个模板化类型,它只应该是复制/移动可构造/可在另一个特定类型的自己的赋值/构造中分配的类型。(试图防止面向用户的代码中的细微错误)
另一种类型是模板参数中的ty胡枝子,因此,为了保存类型,我在类定义中使用了另一种类型。相关实施双边投资条约:
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上出现错误。(尽管消息略有不同)是否有一个有效的语法来执行此操作?或者,还有其他方式来执行我的目标限制吗?
发布于 2017-11-05 09:44:54
您不能使用typedef名称来声明构造函数。标准明确禁止在class.ctor. this /1中这样做:
类名不应是类型胡枝子名.
如果您使用与(内部)类名相一致的ty胡枝子名称,则可以在以下几个方面进行工作:
using some_t = typename Info::some_t;https://stackoverflow.com/questions/47115694
复制相似问题