泛型函数中的类的泛化为基类创建了对象代码?

时间:2018-04-27 18:54:48

标签: c++ c++11 templates

class A {
protected:
    int fooA;
    A() : fooA(0) {}
};

class B {};

template<typename T>
class C : public A {
public:
    using A::A;

    void fooF(T& element) {
        element.fooA = 1;
    }
};

class D : public C<B>, public B {
    using C::C;
};

int main() {

    D d1;
    D d2;

    d1.fooF(d2);

    return 0;
}
error: ‘const class B’ has no member named ‘fooA’ element.fooA = 1;

似乎T特别指向B,它会将d2转换为其父类(B),我该怎么做才能避免这种情况? (我需要这样做,所以我不能改变其继承的类数)。 感谢。

2 个答案:

答案 0 :(得分:1)

  

似乎当T特殊化为B时,它将d2转换为其父类(B),我该怎么做才能避免这种情况?

请勿接纳T中的fooF。取一个T就是切割对象并只给你B部分。如果您改为使用C<T>,则可以访问该对象的A部分。此外,fooF正在使用const变量,因此您无法对其进行修改。将其更改为引用,因此更改将粘贴到您传递的对象将为您提供

void fooF(C<T>& element) {
    element.fooA = 1;
}

答案 1 :(得分:1)

不确定你究竟想要什么...但我怀疑你想要什么

template<typename T>
class C : public A {
public:
    using A::A;

    template <typename U>
    typename std::enable_if<std::is_base_of<C<T>, U>::value>::type
       fooF (U element)
     { element.fooA = 1; }
};

我的意思是......模板fooF(),它会收到C<T>派生类型。

或者可能是B派生类型

    template <typename U>
    typename std::enable_if<std::is_base_of<B, U>::value>::type
       fooF (U element)
     { element.fooA = 1; }