为什么 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;
先给大家展示一下继承结构:
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;