шаблоны функций с аргументами typedef шаблона класса - PullRequest
4 голосов
/ 21 июня 2010

следующий код является примером того, что я пытаюсь сделать в большом проекте:

#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>&?

Ответы [ 2 ]

5 голосов
/ 21 июня 2010

Вывести тип вложения (или любые атрибуты типа вложения) из его вложенного типа невозможно. Это один из примеров так называемого невыгруженного контекста в C ++.

Хотя само объявление функции шаблона является допустимым, вы не сможете вызывать вашу функцию как просто max(var), так как вычет аргумента шаблона не может быть выполнен. В вашем случае компилятор не сможет определить, что параметр x типа std::vector<int> подразумевает, что T равно myvar<int>.

Вы всегда должны будете явно указать аргументы шаблона для max, как в

std::cout << max<int>(var) << std::endl;

Как обойти эту проблему, зависит от того, чего вы пытались достичь, представив прилагаемый шаблон myvar.

1 голос
/ 21 июня 2010

Вместо того, чтобы кодировать это самостоятельно, вы решили вместо этого использовать std::max_element?Требуется начальный и конечный итератор, и я считаю, что делает то, что вы хотите здесь.

...