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;