Посмотрите на этот код.
#include <vector>
template<class ...Args>
using other_vector = std::vector<Args...>;
template<class T>
void f(std::vector<T>& ) {}
template<class T>
void f(other_vector<T>& ) {}
int main()
{
other_vector<int> b;
f(b);
return 0;
}
Он не компилируется, потому что f
переопределяется. Я полностью понимаю ошибку. Однако мне нужен второй класс, который ведет себя как std::vector<T>
, но будет восприниматься как другой тип, чтобы перегрузка, как в приведенном выше примере, была бы законной.
Что я мог сделать?
- Пусть новый класс будет иметь
std::vector<T>
в качестве базового класса. Это может сработать, но не следует наследовать от стандартных контейнеров. - Пусть новый класс имеет член типа std::vector, а затем переобъявите все функции для перенаправления на функции члена. Звучит как много работы.
Любая лучшая альтернатива? Допускается C++11 или C++14.
BOOST_STRONG_TYPEDEF
. Если это не работает с шаблонами, вы, вероятно, могли бы вдохновиться, чтобы сделать что-то, что работает. - person chris   schedule 07.01.2014struct vector_wrapper{ std::vector<T> vector; };
? - person zch   schedule 07.01.2014