C ++ вектор CRTP-общих указателей - PullRequest
0 голосов
/ 12 февраля 2019

В поисках способа хранения объектов CRTP в контейнере я обнаружил следующий вопрос:

Полиморфная коллекция шаблонов Curily Recurring Template Pattern (CRTP) в C ++?

Я попробовал отмеченное решение

https://stackoverflow.com/a/24795227/5475431

, но компилятор жалуется на ошибки типа:

no known conversion for argument 1 from ‘std::shared_ptr<DerivedA>’ to ‘const std::shared_ptr<BaseInterface>&’

вот моя попытка:

#include <vector>
#include <memory>

struct BaseInterface {
    virtual ~BaseInterface() {}
    virtual double interface() = 0;
};

template <typename Derived>
class Base : BaseInterface {
public:
    double interface(){
        return static_cast<Derived*>(this)->implementation();
}
};

class DerivedA : public Base<DerivedA>{
public:
     double implementation(){ return 2.0;}
};

class DerivedB : public Base<DerivedB>{
public:
     double implementation(){ return 1.0;}
};


int main() {
    std::vector<std::shared_ptr<BaseInterface>> ar;
    ar.emplace_back(std::make_shared<DerivedA>());
return 0;
}

У вас есть идеи, как исправить ошибку компилятора или как лучше решить проблему?Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Base должно быть публичным наследством BaseInterface (и вы также забыли return).Тогда ar.emplace_back(std::make_shared<DerivedA>()); хорошо работает:

DEMO

template <typename Derived>
class Base : public BaseInterface {
public:
    double interface(){
        return static_cast<Derived*>(this)->implementation();
    }
};
0 голосов
/ 12 февраля 2019

Вам не хватает оператора возврата и Base должны наследоваться от BaseInterface публично.

template <typename Derived>
struct Base : BaseInterface
{
    double interface() {
        return static_cast<Derived*>(this)->implementation();
    }
};

Live demo

Но будьте осторожны https://stackoverflow.com/a/24795059/5470596 <- ответ, который должен был принять другой ОП. </p>

...