Я хотел бы, чтобы некоторые функции шаблона работали с существующими помощниками шаблонной структуры. Однако вывод аргумента шаблона не удается. Есть ли обходной путь?
Пример
Этот перегруженный operator <<
компилируется и работает:
template <typename T>
inline typename std::vector<T>&
operator<<(
typename std::vector<T>& vec,
const typename std::vector<T>::value_type& val)
{
vec.push_back(val);
return vec;
}
Но когда я пытаюсь использовать помощник struct
, это не компилируется:
template<typename T>
struct Vector
{
typedef std::vector<T> Type;
};
template <typename T>
inline typename Vector<T>::Type&
operator<<(
typename Vector<T>::Type& vec,
const typename Vector<T>::Type::value_type& val)
{
vec.push_back(val);
return vec;
}
ошибка gcc:
error: no match for 'operator<<' (operand types are 'std::vector<int>' and 'int')
...
note: candidate:
'template<class T> typename Vector<T>::Type& operator<<
(typename Vector<T>::Type&, const typename Vector<T>::Type::value_type&)'
operator<<(
^~~~~~~~
note: template argument deduction/substitution failed:
note: couldn't deduce template parameter 'T'
клан ошибка:
error: invalid operands to binary expression ('std::vector<int>' and 'int')
vec << int(2);
~~~ ^ ~~~~~~
note: candidate template ignored: couldn't infer template argument 'T'
operator<<(
^
Вопрос
- Что мешает успешному выводу параметров шаблона в этом случае?
- Есть ли обходной путь
c++03
для этого случая? Шаблоны псевдонимов решат проблему вc++11
.
Примечание. В моей реальной задаче вторым параметром не обязательно является T
, и я не могу использовать его для определения типа вектора.
Примечание 2: реальная вспомогательная структура содержит предварительную обработку для конкретной платформы и выглядит примерно так:
template <class T>
struct Helper
{
#if defined(_WIN32_WCE)
typedef std::vector<T, WMHeapAllocator<T> > Vector;
#else
typedef std::vector<T> Vector;
#endif
};
C<T>::Type
,T
невозможно вывести (у нас может быть (в общем случае) несколькоT
, которые совпадают). (что также имеет место в первом фрагменте с::value_type
, поэтомуT
выводится только из первого параметра). - person Jarod42   schedule 02.02.2018