operator= и функции, которые не унаследованы в C++?

До теста, который я только что провел, я считал, что в C++ не наследуются только конструкторы. Но видимо задание operator=не слишком...

  1. В чем причина этого?
  2. Есть ли обходной путь для наследования оператора присваивания?
  3. Верно ли это и для operator+=, operator-=,...?
  4. Наследуются ли все остальные функции (, кроме конструкторов/операторов = )?

На самом деле, я столкнулся с этой проблемой, когда выполнял 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;
}
36
задан Vincent 17 August 2012 в 17:15
поделиться