模板模板参数和“<<”运算符(ostream)
Template template parameters and "<<" operator (ostream)
几天来,我一直在努力理解模板模板参数。我试图在 Visual Studio 中使用 C++17 编写示例,但出现此错误:
Error C2679 binary '<<': no operator found which takes a right-hand operand of type 'std::vector<int,std::allocator<int>>' (or there is no acceptable conversion)
对于这个例子,我尝试使用来自 STL 的通用容器来突出 C++ 中模板模板参数的想法。
#include <iostream>
#include <vector>
using namespace std;
template<typename T, template<typename> typename Tpl_Type>
ostream& operator <<(ostream& out,const Tpl_Type<T>& x) {
for (auto& aux : x)
out << aux << " ";
out << endl;
return out;
}
template<typename T, template<typename>typename Tpl_Type>
void functioon()
{
Tpl_Type<T> vect2;
for (auto i = 0; i < 5; i++) {
vect2.push_back(i);
}
std::cout << vect2 << endl;
return;
}
int main()
{
functioon<int, std::vector>();
return 0;
}
我做错了什么?
std::vector
是模板参数多于1个的模板,所以functioon
或operator<<
要接受它作为模板模板参数,模板模板参数本身需要接受可变数量的模板参数:
template<typename T, template<typename ...> typename Tpl_Type>
// ^^^
如果不使其可变,clang 和 msvc 将无法编译代码。 gcc 编译两个版本,但我怀疑这是一个错误。
这里是 demo。
几天来,我一直在努力理解模板模板参数。我试图在 Visual Studio 中使用 C++17 编写示例,但出现此错误:
Error C2679 binary '<<': no operator found which takes a right-hand operand of type 'std::vector<int,std::allocator<int>>' (or there is no acceptable conversion)
对于这个例子,我尝试使用来自 STL 的通用容器来突出 C++ 中模板模板参数的想法。
#include <iostream>
#include <vector>
using namespace std;
template<typename T, template<typename> typename Tpl_Type>
ostream& operator <<(ostream& out,const Tpl_Type<T>& x) {
for (auto& aux : x)
out << aux << " ";
out << endl;
return out;
}
template<typename T, template<typename>typename Tpl_Type>
void functioon()
{
Tpl_Type<T> vect2;
for (auto i = 0; i < 5; i++) {
vect2.push_back(i);
}
std::cout << vect2 << endl;
return;
}
int main()
{
functioon<int, std::vector>();
return 0;
}
我做错了什么?
std::vector
是模板参数多于1个的模板,所以functioon
或operator<<
要接受它作为模板模板参数,模板模板参数本身需要接受可变数量的模板参数:
template<typename T, template<typename ...> typename Tpl_Type>
// ^^^
如果不使其可变,clang 和 msvc 将无法编译代码。 gcc 编译两个版本,但我怀疑这是一个错误。
这里是 demo。