Bre*_*and 4 c++ templates arguments typedef function
以下代码是我在大型项目中尝试做的事情的示例:
#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;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我得到:
>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> >&)’
Run Code Online (Sandbox Code Playgroud)
但是,如果我注释掉第8行并取消注释第9行,它会正确编译并给出:
>g++ delme.cpp -o delme
>./delme
4
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么max()using的函数模板定义typename myvar<T>::Type&不被视为匹配,‘max(std::vector<int, std::allocator<int> >&)’有没有办法让它匹配而不使用底层std::vector<T>&类型?
从嵌套类型中推导出封闭类型(或封闭类型的任何属性)是不可能的.它是C++中所谓的非推导上下文的一个例子.
虽然模板函数声明本身是合法的,但max(var)由于无法执行模板参数推导,因此您将无法仅将函数调用.在您的情况下,编译器将无法确定x类型的参数std::vector<int>暗示T是什么myvar<int>.
您将始终必须max明确指定模板参数,如
std::cout << max<int>(var) << std::endl;
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题取决于你试图通过引入封闭myvar模板来实现的目标.