为什么 std::shared_ptr 不适用于基本模板 类?

Why std::shared_ptr doesn't work with base template classes?

先给大家展示一下继承结构:

template <class Type>
class Base {
public:
    Base() {}
    virtual bool verify() const = 0;
};

class Derived : public Base<int> {

public:
    Derived() : Base<int>::Base() {}
    virtual bool verify() const override;
};

因此,Derived 的基数 class 是 Base<int>

我正在尝试定义“|”的模板重载运算符:

template<class Type>
std::shared_ptr<Base<Type>> operator|(std::shared_ptr<Base<Type>> p1, std::shared_ptr<Base<Type>> p2)
{
    return std::shared_ptr<Base<Type>>();
}

而且,如果我这样写:

std::shared_ptr<Derived> d;
std::shared_ptr<Base<int>> bInt;
auto result = d | bInt;

我会收到如下错误:

C++ missing "|" operator corresponding to these operands: std::shared_ptr<Derived> | std::shared_ptr<Base<int>>

但是,如果我在重载时明确指定基类 class 的类型,一切都会正常工作:

std::shared_ptr<Base<int>> operator|(std::shared_ptr<Base<int>> p1, std::shared_ptr<Base<int>> p2)
{
    return std::shared_ptr<Base<int>>();
}

如何使模板化重载工作?

您必须为 Derived class 指定运算符,或者将您的两个变量都保存在 Base 的指针中:

std::shared_ptr<Base<int>> d = std::make_shared<Derived>();
std::shared_ptr<Base<int>> bInt;
auto res = d | bInt;