следующий код является примером того, что я пытаюсь сделать в большом проекте:
#include <iostream>
#include <vector>
// standard template typedef workaround
template<typename T> struct myvar {typedef std::vector<T> Type;};
template<typename T>
T max(typename myvar<T>::Type& x)
// T max(std::vector<T>& x)
{
T y;
y=*x.begin();
for( typename myvar<T>::Type::iterator it=x.begin(); it!=x.end(); ++it )
if( *it>y )
y=*it;
return y;
}
int main(int argc, char **argv)
{
myvar<int>::Type var(3);
var[0]=3;
var[1]=2;
var[2]=4;
std::cout << max(var) << std::endl;
return 0;
}
Когда я пытаюсь его скомпилировать, я получаю:
>g++ delme.cpp -o delme
delme.cpp: In function ‘int main(int, char**)’:
delme.cpp:25: error: no matching function for call to ‘max(std::vector<int, std::allocator<int> >&)’
Однако, если я закомментирую строку 8 и раскомментирую строку 9, она будет правильно скомпилирована и выдаст:
>g++ delme.cpp -o delme
>./delme
4
Может кто-нибудь объяснить, почему определение шаблона функции max () с использованием typename myvar<T>::Type&
не считается совпадением для ‘max(std::vector<int, std::allocator<int> >&)’
, и есть ли способ заставить его соответствовать без использования базового типа std::vector<T>&
?