模板化接口-创建通用模板类以返回任何容器

时间:2018-10-19 01:02:31

标签: c++ c++11

我的想法是在接口外创建一个模板,以便它可以返回任何容器:

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 :(得分: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