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

C++ 具有类模板typedef参数的函数模板,c++,function,templates,arguments,typedef,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>:

以下代码是我在大型项目中尝试执行的一个示例:

#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; 
} 

有人能解释一下为什么使用
typename myvar::Type&
的max()函数模板定义不被认为与
'max(std::vector&)匹配吗“
有没有一种方法可以在不使用底层
std::vector&
类型的情况下使其匹配?

您是否考虑过使用
std::max\u元素来代替自己编码?它需要一个开始和结束迭代器,我相信它会满足您的要求。

从嵌套类型中推断封闭类型(或封闭类型的任何属性)是不可能的。它是C++中所谓的非推导上下文的一个例子。p> 虽然模板函数声明本身是合法的,但您不能仅以
max(var)
的形式调用函数,因为无法执行模板参数推断。在您的情况下,编译器将无法计算出
std::vector
类型的参数
x
意味着
T
myvar

您必须始终明确地为
max
指定模板参数,如中所示

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

std::我能明白吗,谢谢。使用
myvar
模板的原因是在ublas中使用列_主矩阵,而不要求用户始终指定此项,即名称空间Cheb{template struct matrix{typedef boost::numeric::ublas::matrix type;};},然后我希望我的函数具有类型为
Cheb::matrix::type
的参数。我没有太多的模板函数,因此我可以通过显式指定模板参数来生存,但最好不要这样做。如果调用Max()的地方也是一个模板,那么该模板的参数是否可以作为模板参数传递给Max()-这会解析类型吗?谢谢,但我只是使用了
Max()
作为示例。我有其他的函数,其中同样的问题也会发生。我会记住
std::max_元素
,下次我想要一个最大值…:-)
>g++ delme.cpp -o delme
>./delme 
4
std::cout << max<int>(var) << std::endl;