我的想法是在接口外创建一个模板,以便它可以返回任何容器:
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();
}
答案 0 :(得分:0)
将第4行的错字固定为(I
而不是T
之后,编译器会告诉您,在以下命令的return语句中,它无法从const T
转换为T&
T& get() const
。
由于您的get()
是const
限定的,因此this
指针将指向函数内的const
对象。您不能使用非const
引用来引用mutable
对象的非const
成员。
要么const
不符合T& get()
,要么让它返回对const T
的引用:T const& get() const
。