c++ - 创建“ClassType”时出现(/permissive-)的编译错误>' 来自 'std::unique_ptr'
问题描述
我有一个代码片段,当一致性模式设置设置为关闭时,它可以正常工作。当我将一致性模式设置为 (/permissive-) 时。我在涉及模板模板参数的部分代码中遇到错误。
我的代码如下:
template <typename T> using IsNotLValue = std::enable_if_t<!std::is_lvalue_reference_v<T>>;
// Base Class Template
template <typename T> class MyClassBase
{
protected:
template <typename T_ = T, typename = IsNotLValue<T_>>
explicit MyClassBase(T &&ptr) : ptr_(std::move(ptr))
{
std::cout << "MyClassBase ::IsNotLValue" << std::endl;
}
T ptr_ = nullptr;
};
// Derived Class Template
template<typename T> class MyClass : public MyClassBase<T>
{
public:
template <typename T_ = T, typename = IsNotLValue<T_>>
MyClass(T &&ptr) : MyClassBase<T>(std::move(ptr))
{
std::cout << "MyClass :: IsNotLValue" << std::endl;
}
};
// Base Class
class Base
{
public:
int x = 0;
Base() : x(10) {}
};
// Derived Class
class Derived : public Base
{
public:
Derived() :Base(), y(20) {}
int y = 0;
};
// Function returning MyClass Object to pointer to Base Class Type
MyClass<Base*> ptrToBase()
{
return new Derived(); // Line 1 : OK
}
// Function returning uniqueptr to MyClass Object to pointer to Base Class Type
MyClass<std::unique_ptr<Base>> uniquePtrToBase()
{
return std::make_unique<Derived>(); // Line 2 :compilation error here
}
int main()
{
auto pUB = uniquePtrToBase();
auto pB = ptrToBase();
return 0;
}
当一致性模式设置为 ON 时,第 2 行给出编译错误。它正在修复,如果我添加另一个构造函数,如下所示:
template <typename D, typename = IsNotLValue<D>>
MyClass(D &&ptr) : MyClassBase<T>(std::move(ptr))
{
std::cout << "MyClass for uniqueptr" << std::endl;
}
但是,我只想在 D 的模板参数派生自 T 的模板参数或 D 派生自 T 时启用此功能,因此我将条件修改为:
template <typename D, typename T> using IsConvertibleToBase =
std::enable_if_t<std::is_convertible_v<D*, T*>>;
template <typename D, typename = IsConvertibleToBase<D, T>>
MyClass(D &&ptr) : MyClassBase<T>(std::move(ptr))
{
std::cout << "MyClass :: IsConvertibleToBase" << std::endl;
}
这段代码给出了编译错误,因为这里 D is std::unique_ptr<Derived>
and T is std::unique_ptr<Base>
。因此, is_convertible 失败了。
如何确保仅对继承的类启用此 ctor?以及为什么在一致性模式打开时会出现此错误,如果是 ZC 一致性模式,那么是哪一个?我尝试覆盖twoPhase,那没有用?
解决方案
template <typename D, typename T>
using IsConvertibleToBase = std::enable_if_t<std::is_convertible_v<D*, T*>>;
有了上面的定义,D*
和. 一起使用T*
会报错。IsConvertibleToBase
unique_ptr
一种解决方案是使用pointer_traits
适用于任何类似指针的类型:
template <typename D, typename T>
using IsConvertibleToBase = std::enable_if_t<
std::is_convertible_v<typename std::pointer_traits<D>::pointer,
typename std::pointer_traits<T>::pointer>>;
推荐阅读
- python - 我可以将 Django 后台任务中的计算结果发送到前端(Angular)吗?
- javascript - 模板横向 onClick 和 forEach
- list - 安西布尔。在 key:value 对列表中选择第 n 个项目,其中 key 等于 x
- java - 是否有 Spyder 的 runfile() 的替代/类似命令或解决方法?
- r - 将我的话取消列出到 df 但保留所有其他列?
- python-3.x - 如何将 .py 文件上传到 Linux 服务器而不会出错
- machine-learning - AttributeError:“Environment1”对象没有属性“observation_space”
- python - 将字符串映射到字母数字(使用字典)
- tensorflow - 如何获得 CNN 模型大小?
- python - 我有一个依赖于 pytube 的代码,但是当我尝试转换为 exe 时它不起作用