Например, следующий фрагмент кода компилируется в VC ++ 2010:
template<int Rows, int Columns = Rows>
struct Matrix { };
Matrix<4> m;
Обратите внимание, что аргумент по умолчанию для Columns
зависит от значения аргумента для Rows
,
Но это стандарт поведение в C ++ 11 (или ранее), на которое я могу положиться везде?
Да. На самом деле, именно так работают тонны кодов STL.
std::vector
имеет определение как:
template < class T, class Alloc = allocator<T> > class vector
так что вам не нужно указывать allocator
каждый раз каждый раз. Если это неверно, мы не сможем написать:
std::vector<int> data;
И ты написал бы std::map
как:
std::map < keyType, // map::key_type
ValType, // map::mapped_type
less<keyType>, // map::key_compare
allocator<pair<const KeyType,ValType> > // map::allocator_type
> mapping;
что гораздо менее желательно, чем:
std::map< keyType , ValType > mapping;
В соответствии с cplusplus, да:
Также возможно установить значения или типы по умолчанию для параметров шаблона класса. Например, если предыдущее определение шаблона класса было:
template <class T=char, int N=10> class mysequence {..};
И на более простом замечании, g ++ -Wall скомпилирует его.