c ++:为什么模板不能用于推导容器和元素类型?

Hin*_*sum 2 c++ containers templates class typename

我有一个非常简单的测试程序,如下所示:

#include<vector>
#include<iostream>
using namespace std;
template<typename C, typename E>
void f(const C<E>& container){
    cout<<container.size()<<endl;
}
int main(){
    vector<int> i;
    f(i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它无法使用gcc 4.1.2进行编译.错误信息是:

templateContainer.cpp:5: error: ‘C’ is not a template
templateContainer.cpp: In function ‘int main()’:
templateContainer.cpp:10: error: no matching function for call to ‘f(std::vector<int, std::allocator<int> >&)’
Run Code Online (Sandbox Code Playgroud)

Whi*_*TiM 10

您可以使用模板模板参数(并注意std::vector实际上需要多个模板参数[元素类型和分配器类型]):

template<template <typename...> class C, typename... E>
void f(const C<E...>& container){
    cout<<container.size()<<endl;
}
Run Code Online (Sandbox Code Playgroud)

现场演示


如果您不需要类型分解,则可以简单地使用普通模板.

template<typename C>
void f(const C& container){
    cout<<container.size()<<endl;
}
Run Code Online (Sandbox Code Playgroud)

您还可以从STL容器中获取typedef:例如,如果您想知道容器所持有的元素类型,value_type那么就可以使用.

template<typename C>
void f(const C& container){
    using ValueType = typename C::value_type;
    cout<<container.size()<<endl;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,虽然这对于所述问题肯定是正确答案,但如果您实际使用它来推断容器的值类型,那么您应该当场解雇.容器具有关联类型的typedef,您应该始终使用它们.因为容器契约需要那些并且*不*要求值类型完全是模板参数. (2认同)