STL容器作为函数中的模板参数,调用错误
STL container as template parameter in function, error in call
无法理解代码、第二个函数定义或在 main 中调用此函数有什么问题?
我认为,但不确定,调用中的问题,导致没有调用代码编译得很好。编译器 gcc
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template<class T>
void show_element(T ob)
{
cout << ob << " ";
}
template<template<class> class S, class T>
void show_sequence(S<T> sequence)
{
for_each(sequence.begin(), sequence.end(), show_element<T>);
}
int main(int argc, char const *argv[])
{
std::vector<int> v(20, 0);
//here the problem
show_sequence<std::vector<int>, int>(v);
return 0;
}
std::vector
不是一个参数的模板,它也采用分配器类型。您可以将其用作 vector<T>
只是因为第二个参数具有默认值 (std::allocator<T>
).
正如所写,您的模板函数不能接受任何标准容器,因为在我的脑海中,none 只接受一个类型参数。
一种不需要您知道容器需要多少模板参数的可行方法是接受容器 type(不是模板),然后收集值从容器类型中输入。
template<class Seq>
void show_sequence(Seq const& sequence)
{
typedef typename Seq::value_type T;
for_each(sequence.begin(), sequence.end(), show_element<T>);
}
所有标准容器都有一个 value_type
成员,因此这将适用于其中任何一个。此外,它可以与任何从标准库中获取提示的容器一起使用。
问题是 std::vector
是模板,而 std::vector<int>
是类型。
当您将第二个提供给函数时,您提供的是一种类型,而不是模板。
因此,您可以将函数重写为:
template<class S>
void show_sequence(S sequence)
此外,vector 不仅采用一个模板参数,还采用两个模板参数(参见 StoryTeller 回答)
类似于这个问题:
因为vector是<type, allocator>
的模板
代码应该是
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template<class T>
void show_element(T ob)
{
cout << ob << " ";
}
template<template<class,class> class S, class T, class Allocator>
void show_sequence(S<T, Allocator> sequence)
{
for_each(sequence.begin(), sequence.end(), show_element<T>);
}
int main(int argc, char const *argv[])
{
std::vector<int> v(20, 0);
//here problem solved
show_sequence<vector, int, allocator<int> > (v);
show_sequence(v);
return 0;
}
无法理解代码、第二个函数定义或在 main 中调用此函数有什么问题? 我认为,但不确定,调用中的问题,导致没有调用代码编译得很好。编译器 gcc
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template<class T>
void show_element(T ob)
{
cout << ob << " ";
}
template<template<class> class S, class T>
void show_sequence(S<T> sequence)
{
for_each(sequence.begin(), sequence.end(), show_element<T>);
}
int main(int argc, char const *argv[])
{
std::vector<int> v(20, 0);
//here the problem
show_sequence<std::vector<int>, int>(v);
return 0;
}
std::vector
不是一个参数的模板,它也采用分配器类型。您可以将其用作 vector<T>
只是因为第二个参数具有默认值 (std::allocator<T>
).
正如所写,您的模板函数不能接受任何标准容器,因为在我的脑海中,none 只接受一个类型参数。
一种不需要您知道容器需要多少模板参数的可行方法是接受容器 type(不是模板),然后收集值从容器类型中输入。
template<class Seq>
void show_sequence(Seq const& sequence)
{
typedef typename Seq::value_type T;
for_each(sequence.begin(), sequence.end(), show_element<T>);
}
所有标准容器都有一个 value_type
成员,因此这将适用于其中任何一个。此外,它可以与任何从标准库中获取提示的容器一起使用。
问题是 std::vector
是模板,而 std::vector<int>
是类型。
当您将第二个提供给函数时,您提供的是一种类型,而不是模板。
因此,您可以将函数重写为:
template<class S>
void show_sequence(S sequence)
此外,vector 不仅采用一个模板参数,还采用两个模板参数(参见 StoryTeller 回答)
类似于这个问题:
因为vector是<type, allocator>
代码应该是
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template<class T>
void show_element(T ob)
{
cout << ob << " ";
}
template<template<class,class> class S, class T, class Allocator>
void show_sequence(S<T, Allocator> sequence)
{
for_each(sequence.begin(), sequence.end(), show_element<T>);
}
int main(int argc, char const *argv[])
{
std::vector<int> v(20, 0);
//here problem solved
show_sequence<vector, int, allocator<int> > (v);
show_sequence(v);
return 0;
}