代码之家  ›  专栏  ›  技术社区  ›  Pustovalov Dmitry

使用静态信息创建字符串类[重复]

  •  0
  • Pustovalov Dmitry  · 技术社区  · 7 年前

    我想使用 using 关键词:

    #include <iostream>
    
    struct A
    {
        A() = default;
    
        A(const A  &) { std::cerr << __PRETTY_FUNCTION__ << std::endl; }
        A(      A &&) { std::cerr << __PRETTY_FUNCTION__ << std::endl; }
    
        A& operator=(const A  &) { std::cerr << __PRETTY_FUNCTION__ << std::endl; return *this; }
        A& operator=(      A &&) { std::cerr << __PRETTY_FUNCTION__ << std::endl; return *this; }
    };
    
    struct B : A
    {
        using A::A;
        using A::operator=;
    
        B& operator=(const B  &) { std::cerr << __PRETTY_FUNCTION__ << std::endl; return *this; }
        B& operator=(      B &&) { std::cerr << __PRETTY_FUNCTION__ << std::endl; return *this; }
    };
    
    int main()
    {
        A a;
        B b;
        b = a; // OK
        B b1(          a ); // compile error
        B b2(std::move(a)); // compile error
        return 0;
    }
    

    使用继承赋值运算符 使用 关键字工作正常,但继承复制和移动构造函数会导致编译错误: 继承的构造函数不是从相同或派生类型的表达式初始化的候选构造函数

    http://coliru.stacked-crooked.com/a/fe84b429c391c894 :

    main.cpp:16:14: note:   an inherited constructor is not a candidate for initialization from an expression of the same or derived type
    main.cpp:8:5: note: candidate: A::A(A&&)
         A(      A &&) { std::cerr << __PRETTY_FUNCTION__ << std::endl; }
         ^
    main.cpp:16:14: note:   inherited here
         using A::A;
    

    为什么我可以继承赋值运算符,但不能继承复制构造函数?有什么区别?如果我不能继承赋值运算符,我可以理解。但相反地继承赋值运算符被认为是可以的。这对我来说有点奇怪。

    故事

    我想要的与 this 问题:我只想向现有类添加新方法,而不需要修改它(它是来自另一个库的类)。

    http://coliru.stacked-crooked.com/a/149a6194717cd465 :

    #include <iostream>
    
    struct A // not my class
    {
    };
    
    struct B : A
    {
        using A::A;
        using A::operator=;
    
        void foo() { std::cerr << "fuu" << std::endl; }
    };
    
    A NotMyFunc()
    {
        return {};
    }
    
    int main()
    {
        B b(NotMyFunc());
        b.foo();
        return 0;
    }
    

    但我不想重新实现复制和移动构造函数。

    0 回复  |  直到 8 年前
        1
  •  2
  •   Jive Dadson hmishra2250    8 年前

    您需要一个具有as参数的B构造函数。然后需要显式地设置默认构造函数。

    struct B : A
    {
        using A::A;
        using A::operator=;
    
        B() = default;
        B(const A& a) : A(a) {}
        B(A &&a): A(std::move(a)) {}
    };