2017-10-11 84 views
0

我試圖獲取模板掛,並具有以下代碼:模板參數無效

town.h

#ifndef TOWN_H 
#define TOWN_H 

namespace segregation { 
    template <typename Pos, typename Resident, template <typename> class Container> 
    class Town { 
    public: 
     Town(); 
     virtual ~Town(); 
     virtual Resident getResident(Pos address); 
     virtual void move(const Pos& from, const Pos& to); 
     virtual Container<Resident> getNeighbours(const Pos address); 
    }; 
} 


#endif /* TOWN_H */ 

flat_town.h

#ifndef FLAT_TOWN_H 
#define FLAT_TOWN_H 
#include "town.h" 
#include <array> 
#include <forward_list> 
#include <utility> 
namespace segregation { 

    template<int x, int y, class R> 
    using TownMap = std::array<std::array<R, y>, x>; 

    template <typename R> 
    using Neighbourhood = std::forward_list<R>; 

    using Pos = std::pair<int, int>; 

    template <int x, int y, class Resident> 
    class FlatTown: public Town<Pos, Resident, Neighbourhood<typename Resident>> { 
    private: 
     TownMap<x, y, Resident> m_townMap; 
     int m_neighbourhood_size; 

    public: 
     FlatTown(TownMap<x, y, Resident> t_townMap, int t_neighbourhood_size) : 
      m_townMap(t_townMap), m_neighbourhood_size(t_neighbourhood_size) {}; 

     Resident getResident(const Pos & address); 

     void move(const Pos & from, const Pos & to); 

     Neighbourhood<Resident> getNeighbours(const Pos & address); 

     virtual ~FlatTown(); 
    }; 
} 

#endif /* FLAT_TOWN_H */ 

我目前還沒有一個IDE,所以我通過運行

$ g++ flat_town.h 

產生以下錯誤驗證正確性:

flat_town.h:18:76: error: template argument 1 is invalid 
    class FlatTown: public Town<Pos, Resident, Neighbourhood<typename Resident>> { 
                      ^~ 
flat_town.h:18:45: error: template argument 3 is invalid 
    class FlatTown: public Town<Pos, Resident, Neighbourhood<typename Resident>> { 
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

我覺得這些更高級的模板非常不確定和所有幫助表示讚賞。

問候,托比亞斯

+1

我對編譯頭文件的原因更感興趣嗎?爲什麼不包含*頭文件的源文件? –

+0

您應該也許應該閱讀[爲什麼模板只能在頭文件中實現?](https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-文件) –

+1

@Someprogrammerdude從某種意義上說,它是獲得最小樣本的自然方式(它只是斬斷一個不必要的'#include「flat_town.h」':) :) – sehe

回答

1

您指定模板模板參數不正確。只需指定模板的名稱,即

class FlatTown: public Town<Pos, Resident, Neighbourhood> { 
+0

當然!謝謝!順便說一句,我來自斯卡拉,我不知道我正在做C++。你知道這種通用編程是否可行嗎? – user25470

+0

@ user25470如果不知道使用場景,很難說。無論如何,目前的代碼似乎很好。 – songyuanyao

+0

這個想法是爲了模擬城市內部的移動,看看居民之間是否存在相似性偏好,是否會出現自然分離現象,即如果A類居民更偏好其偏好,則A類居民將離開另一個居民區。由於我想稍微嘗試一下,我希望基地town.h儘可能通用 – user25470

相關問題