這是錯誤:的類型爲std參考無效初始化::向量
DummyService.hpp:35: error: invalid covariant return type for 'virtual std::vector < ResourceBean*, std::allocator < ResourceBean*> >& DummyService::list(const std::string&)'
class Bean {
public:
typedef std::string Path;
virtual ~Bean() {};
virtual const Path& getPath() = 0;
virtual const std::string& getName() = 0;
protected:
Bean();
};
class ResourceBean: public Bean {
public:
ResourceBean(const Path& path, const std::string& contents) :
_path(path), _contents(contents) {
}
virtual ~ResourceBean() { }
virtual const Path& getPath();
virtual void setPath(const Path& path);
virtual const std::string& getName();
virtual void setName(const std::string& name);
private:
Path _path;
std::string _name;
};
上面Bean
類是數據表示,並且它們由兩個不同的層使用。一層使用Bean
接口,僅用於訪問數據的獲取者。 ResourceBean
由數據訪問對象(DAO)類訪問,該類從數據庫中獲取數據(例如),並填寫ResourceBean
。在DAO的
一個責任是列出的資源給予一定的路徑:
class Service {
protected:
/*
* Service object must not be instantiated (derived classes must be instantiated instead). Service is an interface for the generic Service.
*/
Service();
public:
virtual std::vector<Bean*>& list(const Bean::Path& path) = 0;
virtual ~Service();
};
class DummyService: public Service {
public:
DummyService();
~DummyService();
virtual std::vector<ResourceBean*>& list(const ResourceBean::Path& path);
};
我認爲這個問題是一個事實,即在std::vector<ResourceBean*>
編譯器不明白Bean
實際上是基類相關ResourceBean
。
有什麼建議嗎?我已經閱讀了一些類似的主題,但一些解決方案在我的情況下不起作用。請指出我是否遺漏了一些東西。先謝謝你。
在繼續之前,請注意您的代碼不是類型安全的(它是要編譯的)。一個'std :: vector'不是'std :: vector '的有效子類型(在一般LSP意義上),因爲'std :: vector '不支持所有'std :: vector '的操作(例如,您可以將任何'Bean *'放入'std :: vector '中,而您只能將'ResourceBean *'放入'std :: vector ')。 –
Mankarse
謝謝你的回覆。我試圖理解爲什麼你說「一個std :: vector不支持std :: vector 所做的所有操作」。另外,當你說「你可以把任何Bean *放入std :: vector ,而你只能將一個ResourceBean *放入一個std :: vector 」時,你的意思是你可以放任何Bean * (包括*派生類)? –
是的。例如,你可以**將'FooBean *'放入一個'std :: vector'(其中'FooBean'是'Bean'的某個子類),但是你**不能**放入一個'FooBean *轉換成'std :: vector '。如果某些代碼使用'Service :: list'並且期望引用'std :: vector'表示'FooBean *'可以放入,則由'DummyService ::'返回的'std :: vector '清單'是不夠的。 –
Mankarse