模板参数无效

时间:2017-10-11 06:51:41

标签: c++ templates inheritance

我试图获取模板并拥有以下代码:

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

您错误地指定了模板模板参数。只需指定模板的名称,即

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