gpt4 book ai didi

c++ - 从 'ClassType>' 创建 'std::unique_ptr' 时出现 (/permissive-) 的编译错误

转载 作者:行者123 更新时间:2023-11-28 04:05:27 24 4
gpt4 key购买 nike

我有一个代码片段,当一致性模式设置被设置为关闭时,它可以正常工作。当我将一致性模式设置为 (/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 是 std::unique_ptr<Derived> T 是 std::unique_ptr<Base> .因此,is_convertible 失败了。

我如何确保只为继承的类启用此构造函数?和为什么在一致性模式开启时会出现此错误,如果是 ZC 一致性模式,那么是哪个?我尝试覆盖 twoPhase,但没有用?

最佳答案

template <typename D, typename T> 
using IsConvertibleToBase = std::enable_if_t<std::is_convertible_v<D*, T*>>;

根据上述定义,当IsConvertibleToBaseunique_ptr一起使用时,D*T*会报错.

一种解决方案是使用 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>>;

关于c++ - 从 'ClassType<std::unique_ptr<Base>>' 创建 'std::unique_ptr<Derived>' 时出现 (/permissive-) 的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58799169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com