2010-06-21 53 views
4

下面的代码是什么我想在一个大的项目做一个例子函数模板:与类模板的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> >&)’匹配,并且有没有办法让它匹配而不使用底层的std::vector<T>&类型?

回答

5

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

尽管模板函数声明本身是合法的,但由于无法执行模板参数推导,您将无法仅将函数作为max(var)调用。在你的情况下,编译器将无法弄清std::vector<int>类型的参数x意味着Tmyvar<int>

你永远要为max明确指定模板参数,如

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

如何解决这个问题取决于你试图通过引入以达到封闭myvar模板。

+0

我明白了,谢谢。 的原因'myvar'模板是使用的uBLAS column_major基质,而不需要用户始终指定这一点,即 命名空间海布 { 模板 结构矩阵{ 的typedef提高::数字:: uBLAS库: :矩阵类型; }; } 然后,我希望我的函数具有'Cheb :: matrix :: type'类型的参数。我没有太多的模板化函数,所以我可以在明确指定模板参数的情况下生存下来,但不需要。 – 2010-06-21 18:13:52

+0

如果Max()被调用的地方也是一个模板,该模板的参数是否可以作为模板参数传递给Max() - 是否可以解析类型? – fusi 2015-06-22 00:39:22

1

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

+0

谢谢,但我只是使用'max()'作为例子。我有其他功能发生同样的问题。我会记住'std :: max_element',以便下一次我想要一个最大值,但是... :-) – 2010-06-21 18:26:23