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++ 模板中的Typedef导致阴影模板参数错误_C++_Templates_Typedef - Fatal编程技术网

C++ 模板中的Typedef导致阴影模板参数错误

C++ 模板中的Typedef导致阴影模板参数错误,c++,templates,typedef,C++,Templates,Typedef,我有一个模板类,我在其中使用typedef声明一个映射,如下所示: #include <map> template <typename T> class LocalStub { typedef std::map<T, T> QueryMap; typedef std::pair<T, T> QueryPair; typedef QueryMap::iterator QueryMapIterator; public: LocalS

我有一个模板类,我在其中使用typedef声明一个映射,如下所示:

#include <map>

template <typename T> class LocalStub {
  typedef std::map<T, T> QueryMap;
  typedef std::pair<T, T> QueryPair;
  typedef QueryMap::iterator QueryMapIterator;

public:
  LocalStub();
  ~LocalStub();
  void AddQuery(const T &, const T &);
  const T &Answer(const T &) const;
private:
  QueryMap _queryMap;
};


我做错了什么?我不明白为什么会出现这样的错误。

您忘记用
QueryMapIterator
编写关键字
typename
。以下是更新版本:

template <typename T> class LocalStub {
  typedef std::map<T, T> QueryMap;
  typedef std::pair<T, T> QueryPair;
  typedef typename QueryMap::iterator QueryMapIterator;

public:
  LocalStub();
  ~LocalStub();
  void AddQuery(const T &, const T &);
  const T &Answer(const T &) const;
private:
  QueryMap _queryMap;
};
模板类LocalStub{
typedef std::map QueryMap;
typedef std::pair QueryPair;
typedef typename QueryMap::迭代器QueryMap操作符;
公众:
LocalStub();
~LocalStub();
void AddQuery(常量T&,常量T&);
常数T和应答(常数T和)常数;
私人:
QueryMap _QueryMap;
};

此要求的原因是编译器此时不知道
querymapierator
是描述成员变量还是嵌套类型

TL;DR-
typedef-typename查询映射::迭代器查询映射器

较长版本:
QueryMap::iterator
是一个,因此需要在
typedef
对其进行初始化之前使用
typename
。依赖项名称问题源于这样一个事实,即在模板构造
type::something
中,
something
可能引用类型、值或函数,如下例所示:

template<class T>
struct foo{
    void bar(){ T::something; }
};

struct baz{
    using something = int;
};

struct bez{
    static const int something = 0;
};
模板
结构foo{
void bar(){T::something;}
};
结构baz{
使用某物=int;
};
结构bez{
静态常数int某物=0;
};

因此,如果要传递的名称引用类型,则需要使用
typename
向编译器提供附加信息。

=>
typedef typename QueryMap::iterator querymapierator@AMA请原谅我的问题,但我为什么要添加typename>您应该查看。谢谢您的回答。在这种情况下,我为什么要添加typename?我已经更新了答案
template<class T>
struct foo{
    void bar(){ T::something; }
};

struct baz{
    using something = int;
};

struct bez{
    static const int something = 0;
};