Templated Interface - создайте общий шаблонный класс для возврата любого контейнера - PullRequest
0 голосов
/ 19 октября 2018

Моя идея состоит в том, чтобы создать шаблон вне интерфейса так, чтобы он мог возвращать любой контейнер:

template <class T>
class IValue {
public:
    virtual I& get() const = 0;
};

template<typename T>
class Value : public IValue<T>
{
public:
    Value() :m_value()
    {}
    virtual T& get() const override
    {
        return m_value;
    }
    virtual ~Value()
    {}
private:
    T m_value;
};

class A
{
public:
    A() {}
};

int main()
{
    Value<A> a1;
    //a1.get();
}

Но я получаю ошибку компиляции, как указано ниже:

 $ c++ -std=c++14 try52.cpp
    try52.cpp:4:17: error: 'I' does not name a type
             virtual I& get() const = 0;
                     ^
    try52.cpp: In instantiation of 'class Value<A>':
    try52.cpp:32:10:   required from here
    try52.cpp:14:16: error: 'T& Value<T>::get() const [with T = A]' marked override, but does not override
         virtual T& get() const override
                    ^
    try52.cpp: In instantiation of 'T& Value<T>::get() const [with T = A]':
    try52.cpp:34:1:   required from here
    try52.cpp:16:16: error: invalid initialization of reference of type 'A&' from expression of type 'const A'
             return m_value;

Как можноЯ проектирую или внедряю такую ​​функциональность?


Спасибо за комментарий, я получил эту работу, но это правильный дизайн:

template <class T>
class IValue {
    public:
        virtual const T& get() const = 0;
};

template<typename T>
class Value : public IValue<T>
{
public:
    Value() :m_value()
    {}
    virtual const T& get() const override
    {
        return m_value; 
    }
    virtual ~Value()
    {}
private:
    T m_value;
};

class A
{
public:
   A(){}
};

int main()
{
   Value<A> a1;
   a1.get();
}

1 Ответ

0 голосов
/ 19 октября 2018

После исправления вашей опечатки в строке 4 (I вместо T) ваш компилятор скажет вам, что он не может преобразовать из const T в T& в операторе возврата T& get() const.

Поскольку ваш get() квалифицирован const, указатель this будет указывать на объект const внутри функции.Вы не можете использовать не const ссылку для ссылки на не mutable член const объекта.

Либо не const квалифицируйте T& get(), либо попросите вернуть ссылкуна const T: T const& get() const.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...