2010-07-04 9 views
0

В определении парного класса в C++ есть два typedefs. для чего они? их нет в коде!C++ пара шаблон декларация объявления неоднозначность!

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) { } 
} 
+0

Не использовать в * what * code? Какой конкретный код кода вы проверили, чтобы прийти к выводу, что эти typedefs не используются? – AnT

+0

в самой декларации! – Kamran

ответ

7

Они здесь для вашего удобства, поэтому вы можете использовать их в своем коде. C++ не имеет модели отражения, так что это единственный способ, которым Вы должны «знать», какие типы они Предположим, вы определяете свою собственную пару

ЬурейеЕ пара MyPair;

Затем вы можете использовать

MyPair :: first_type
MyPair :: second_type

, например,

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

Тогда вам не нужно исследований и замените всюду в своем коде, если вы измените исходное определение o f MyPair.

5

Это, чтобы другие части кода, чтобы объявлять переменные типов, не имея прямой доступ к параметрам типа (Т1 & Т2). Аналогичный, менее тривиальный, например, являются определениями типов в контейнерных классах:

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

При этом используется ЬурейеЕ iterator, определенные в шаблоне вектора для создания curNum. Это будет несколько менее полезным прийти C++ 0x в auto ключевое слово:

for(auto curNum = someVect.begin(); curNum != someVect.end(); curNum++) 
    ; 
1

Они являются общественные псевдонимами пройденных в Т1 и Т2 типов, которые могут быть ссылки после того, как объект построен.

3

Это значит, что вы можете ссылаться на типы в своем коде, используя, например, pair<int,string>::first_type myVariable, или если вы напечатали особый аромат шаблона, то MyPair::first_type myVariable.