如何在类模板中实现赋值运算符?

时间:2018-11-27 19:56:25

标签: c++ c++11 templates g++

我以为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 :(得分:1)

foo 私有继承自tKeySetString<foo>,这意味着operator=将不会成为其公共界面的一部分。

您可以通过编写

将其引入
public:
    using tKeySetString::operator=;

foo的定义中。

答案 1 :(得分:0)

您没有为operator=类显式创建一个tKeySetString,因此编译器将为您创建一个默认值。但是,这将隐藏继承的operator=。因此,您需要显式声明要使用基类的operator=。您需要添加:

using tKeySetString::operator=;

foo的公共部分。

请参阅相关讨论Trouble with inheritance of operator= in C++