Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数无效_C++_Templates_Inheritance - Fatal编程技术网

C++ 模板参数无效

C++ 模板参数无效,c++,templates,inheritance,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();

我正在尝试获得模板的挂起,并具有以下代码:

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 */
#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 */
这将生成以下错误:

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>> {
                                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
flat_town.h:18:76:错误:模板参数1无效
等级:平镇:公共镇{
^~
flat_town.h:18:45:错误:模板参数3无效
等级:平镇:公共镇{
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我对这些高阶模板感到非常不确定,非常感谢所有帮助


尊敬的Tobias,您错误地指定了template-template参数。只需指定模板的名称,即

class FlatTown: public Town<Pos, Resident, Neighbourhood> {
class FlatTown:公共城镇{

指定的模板参数不正确。只需指定模板的名称,即

class FlatTown: public Town<Pos, Resident, Neighbourhood> {
class FlatTown:公共城镇{

我更感兴趣的是为什么要编译头文件?为什么不编译包含头文件的源文件?从某种意义上说,您可能还应该阅读@Someprogrammerdude,这是获取最少样本的自然方式(只是切掉不必要的
#包括“flat_town.h”
:))@某个程序员,我只是想一步一步地清除bug,因为这一步与模板相关,所以将g++限制在标题似乎很自然。我将阅读您引用的链接,谢谢。我更感兴趣的是为什么要编译标题文件?为什么不包括标题文件的源文件?您可能还应该阅读@Someprogrammerdude从某种意义上说,这是获取最少样本的自然方式(它只是切碎了一个不必要的
#包括“flat\u town.h”
:)某个程序员,我只是想一次一步地清除bug,因为这一点与模板有关,它似乎是自然地将G++限制到标题中。我会阅读你引用的链接,当然感谢。顺便说一下,我来自Scala,我不确定我是否在C++中做了C++。你知道这种类型吗?ic编程是一条路?@user25470在不知道使用场景的情况下,很难说这一点。无论如何,当前的代码似乎很好。这个想法是模拟城市内的运动,看看如果居民之间有某种相似的偏好,隔离是否会自然发生,也就是说,如果是a型居民,他会离开一个社区,换成另一个更多的符合它的偏好。因为我想尝试一下,我想基地,小镇。h,当然是通用的!谢谢!顺便说一下,我来自Scala,我不确定我是否正在正确地做C++。你知道这种泛型编程是不是走的路?@ USER 25470很难说不知道。使用场景。无论如何,当前的代码似乎很好。这个想法是模拟一个城市内的运动,看看如果居民之间有某种相似的偏好,隔离是否会自然发生,也就是说,如果a型居民更符合自己的偏好,他们会离开一个街区去另一个街区。因为我想做一点实验,所以我想要基地,town.h,尽可能通用