在我刚刚进行的测试之前,我认为在 C++ 中只有构造函数不被继承。但显然,任务operator=
是不是太...
- 这是什么原因呢?
- 是否有任何解决方法来继承赋值运算符?
- 是否也是如此
operator+=
, operator-=
, ... ?
- 所有其他函数(除了构造函数/运算符=)都是继承的吗?
事实上,我在做一些 CRTP 时遇到了这个问题:
template<class Crtp> class Base
{
inline Crtp& operator=(const Base<Crtp>& rhs) {/*SOMETHING*/; return static_cast<Crtp&>(*this);}
};
class Derived1 : public Base<Derived1>
{
};
class Derived2 : public Base<Derived2>
{
};
有什么解决方案可以让它发挥作用吗?
编辑:好的,我已经隔离了问题。为什么以下不起作用?如何解决问题?
#include <iostream>
#include <type_traits>
// Base class
template<template<typename, unsigned int> class CRTP, typename T, unsigned int N> class Base
{
// Cast to base
public:
inline Base<CRTP, T, N>& operator()()
{
return *this;
}
// Operator =
public:
template<typename T0, class = typename std::enable_if<std::is_convertible<T0, T>::value>::type>
inline CRTP<T, N>& operator=(const T0& rhs)
{
for (unsigned int i = 0; i < N; ++i) {
_data[i] = rhs;
}
return static_cast<CRTP<T, N>&>(*this);
}
// Data members
protected:
T _data[N];
};
// Derived class
template<typename T, unsigned int N> class Derived : public Base<Derived, T, N>
{
};
// Main
int main()
{
Derived<double, 3> x;
x() = 3; // <- This is OK
x = 3; // <- error: no match for 'operator=' in ' x=3 '
return 0;
}
赋值运算符在技术上是继承的;但是,它始终被派生类的显式或隐式定义的赋值运算符隐藏(请参阅下面的注释)。
(13.5.3 赋值)赋值运算符应由
仅有一个参数的非静态成员函数。因为副本
赋值运算符operator=
为 a 类隐式声明,如果
未由用户声明,基类赋值运算符始终
被派生类的复制赋值运算符隐藏。
您可以实现一个虚拟赋值运算符,它只需将调用转发到基类operator=
, 像这样:
// Derived class
template<typename T, unsigned int N> class Derived : public Base<Derived, T, N>
{
public:
template<typename T0, class = typename std::enable_if<std::is_convertible<T0, T>::value>::type>
inline Derived& operator=(const T0& rhs)
{
return Base<Derived, T, N>::operator=(rhs);
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)