小编Wha*_*hee的帖子

衍生出奇怪的重复模板和协方差

假设我有一个克隆派生类的基类:

class Base
{
    public:
        virtual Base * clone()
        {
            return new Base();
        }

        // ...
};
Run Code Online (Sandbox Code Playgroud)

我有一组派生类,使用奇怪的重复模板模式实现:

template <class T>
class CRTP : public Base
{
    public:
        virtual T * clone()
        {
            return new T();
        }

        // ...
};
Run Code Online (Sandbox Code Playgroud)

我试图从这个进一步得出这样的:

class Derived : public CRTP<Derived>
{
    public:
        // ...
};
Run Code Online (Sandbox Code Playgroud)

我得到编译错误的效果:

error C2555: 'CRTP<T>::clone': overriding virtual function return type differs and is not covariant from 'Base::clone'
Run Code Online (Sandbox Code Playgroud)

我意识到这可能是编译器在实例化CRTP时不完全知道Derived的继承树的结果.此外,用(Base*)替换返回类型(T*)也会编译.但是,我想知道是否存在保留上述语义的工作.

c++ templates visual-studio-2010 crtp f-bounded-polymorphism

8
推荐指数
1
解决办法
627
查看次数

std :: remove_if是否会调用析构函数?

我正在使用std::remove_if将选择的std::vector元素移动到最后,以便我可以将它们复制到另一个向量然后擦除范围:

using ElemPtr = std::shared_ptr<Elem>;
auto iter = std::remove_if(source.begin(),source.end(), [&](const ElemPtr& e){ /* ... */ });
dest.insert(dest.end(),iter,source.end());
source.erase(iter,source.end());
Run Code Online (Sandbox Code Playgroud)

发生的事情是,在调用之后std::remove_if,要删除的值会调用它们的析构函数(即它们被设置为null).我最终只是复制了一堆空指针,这不是很好.

像cppreference.com这样的资源没有提到这种行为,所以我想知道这是否是编译器错误?

我正在使用gcc 5.2.0.

c++

3
推荐指数
1
解决办法
477
查看次数