Как я могу реализовать оператор присваивания в шаблоне класса? ` - PullRequest
0 голосов
/ 27 ноября 2018

Я думал, что на мою проблему ответил this , но я не могу получить следующее для компиляции:

#include <string>

template<class C>
class tKeySet {
  protected:
    bool set;
    static const std::string key;
};

template<class C, typename T>
class tKeySetType : private tKeySet<C> {
  protected:
    T m_val;
};

template<class C>
class tKeySetString: private tKeySetType<C, std::string> {
  public:
    tKeySetString<C>& operator=(const std::string &str) {
        this->set = true;
        this->m_val = str;
        return *this;
    }
};

class foo : private tKeySetString<foo> { };
template<> const std::string tKeySet<foo>::key = "foo key";

int main(void) {
    foo f;

    f = std::string("foo");

    return 0;
}

Как я могу заставить оператор присваивания в tKeySetString<C> работатьс std::string?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы явно не создали operator= для класса tKeySetString, поэтому компилятор создаст для вас класс по умолчанию.Это, однако, скроет унаследованный operator=.Следовательно, вам нужно явно объявить, что вы хотите использовать operator= базового класса.Вам необходимо добавить:

using tKeySetString::operator=;

в публичной части foo.

См. Соответствующее обсуждение Проблема с наследованием оператора = в C ++ .

0 голосов
/ 27 ноября 2018

foo конфиденциально наследуется от tKeySetString<foo>, что означает, что operator= не будет частью его открытого интерфейса.

Вы можете внести его, написав

public:
    using tKeySetString::operator=;

в определении foo.

...