用一个类和一个模板扩展模板类

时间:2018-07-10 16:12:19

标签: c++ gcc

我试图为malloc的unique_ptr创建一个快捷方式类,但是我无法使用默认构造函数对其进行扩展。这就是为什么我尝试对示例类进行相同的操作,以解决错误。效果很好:

namespace paw {
    template<class T, class F>
    class Cl {
    public:
        Cl(T* t, F f): t(t), f(f) {}
        virtual ~Cl() { if (t!= 0) { f(t); } }
    private:
        T* t;
        F f;
    };
}

class ClInt : public paw::Cl<int, std::function<void(int*)>> {
public:
    ClInt() : Cl(0, free) {}
    ClInt(int* t) : Cl(t, free) {}
};

int main() {
    ClInt clint;
}

但是,当我概括ClInt类时:

namespace paw {
    template<class T, class F>
    class Cl {
    public:
        Cl(T* t, F f): t(t), f(f) {}
        virtual ~Cl() { if (t!= 0) { f(t); }}
    private:
        T* t;
        F f;
    };

}

template<class T>
class ClInt : public paw::Cl<T, std::function<void(T*)>> {
public:
    ClInt() : Cl(0, free) {}
    ClInt(T* t) : Cl(t, free) {}


};

int main() {
    ClInt<int> clint;
}

我得到这个奇怪的错误:

error: class 'ClInt<T>' does not have any field named 'Cl'

但是我不能用paw::命名空间调用超类构造函数,因为我得到了

error: expected class-name before '(' token

有什么区别?为什么不起作用?

1 个答案:

答案 0 :(得分:2)

只需对模板实例使用完整签名,如下所示:

template<class T>
class ClInt : public paw::Cl<T, std::function<void(T*)>> {
public:
    ClInt() : paw::Cl<T, std::function<void(T*)>>(0, free) {}
    ClInt(T* t) : paw::Cl<T, std::function<void(T*)>>(t, free) {}


};