c ++对模板结构声明歧义!

时间:2010-07-04 17:56:18

标签: c++ templates definition ambiguity std-pair

在c ++中对类的定义中有两个typedef。它们是为了什么?在代码中没有使用它们!

template <class T1, class T2> struct pair
{
  typedef T1 first_type;
  typedef T2 second_type;

  T1 first;
  T2 second;
  pair() : first(T1()), second(T2()) {}
  pair(const T1& x, const T2& y) : first(x), second(y) {}
  template <class U, class V>
    pair (const pair<U,V> &p) : first(p.first), second(p.second) { }
}

4 个答案:

答案 0 :(得分:7)

它们只是为了您的方便,所以您可以在代码中使用它们。 C ++没有反射模型,所以这是你“知道”它们是什么类型的唯一方式 假设您定义了自己的对

  

typedef对MyPair;

然后你可以使用

  

MyPair :: first_type
  MyPair :: second_type

例如,

MyPair::first_type my_first(MyPair& pair)
{
    return pair.first;
}

如果您更改MyPair的原始定义,则无需在代码中的任何地方进行研究和替换。

答案 1 :(得分:5)

允许其他代码片段声明类型的变量,而无需直接访问类型参数(T1和T2)。类似的,不那么简单的例子是容器类中的typedef:

vector<int>::iterator curNum;
for(curNum = someVect.begin(); curNum != someVect.end(); curNum++)
    ; //do stuff

这使用向量模板中定义的typedef iterator来创建curNum。 C ++ 0x的auto关键字:

对它来说有点不太有用
for(auto curNum = someVect.begin(); curNum != someVect.end(); curNum++)
    ;

答案 2 :(得分:3)

这样您就可以使用例如代码来引用代码中的类型。 pair<int,string>::first_type myVariable,或者如果您已经键入了特定版本的模板MyPair::first_type myVariable

答案 3 :(得分:1)

它们是传入的T1和T2类型的公共别名,可以在构造对象后引用它们。