Моя идея состоит в том, чтобы создать шаблон вне интерфейса так, чтобы он мог возвращать любой контейнер:
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();
}