具有类模板typedef参数的函数模板

时间:2010-06-21 16:08:03

标签: c++ function templates arguments typedef

以下代码是我在大型项目中尝试做的事情的一个例子:

#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

有人可以解释为什么使用typename myvar<T>::Type&的max()的函数模板定义不被视为‘max(std::vector<int, std::allocator<int> >&)’的匹配,并且有没有办法让它匹配而不使用底层{ {1}}输入?

2 个答案:

答案 0 :(得分:5)

从嵌套类型中推导封闭类型(或封闭类型的任何属性)是不可能的。它是C ++中所谓的非推导上下文的示例之一。

虽然模板函数声明本身是合法的,但由于无法执行模板参数推导,因此您无法将函数称为max(var)。在您的情况下,编译器将无法确定x类型的参数std::vector<int>意味着Tmyvar<int>

您必须明确指定max的模板参数,如

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

如何解决此问题取决于您尝试通过引入封闭的myvar模板来实现的目标。

答案 1 :(得分:1)

您是否考虑过使用std::max_element而不是自己编码?它需要一个开始和结束迭代器,我相信在这里做你想要的。