C++ 根据模板参数定义并推断参数

C++ 根据模板参数定义并推断参数,c++,C++,基于 问题1>这些编译错误背后的原因是什么 我们总是必须显式定义模板参数中使用的类型参数,这是真的吗 问题2>当我们调用下一行时,编译器如何推断A的类型 编译器是否根据列表中定义的模板参数A的默认参数推断类型A 指 而类型A是分配器?如果删除这些,则A和T仅在C上下文中已知,而在擦除模板上下文中未知。如果删除这些,则A和T仅在C上下文中已知,而在擦除模板上下文中未知。问题1 第一个T和A是C的参数,而不是擦除模板的参数。因此,它们对它不可见,可见的是用^^突出显示的第二个和第三个参数。请注意,第

基于

问题1>这些编译错误背后的原因是什么

我们总是必须显式定义模板参数中使用的类型参数,这是真的吗

问题2>当我们调用下一行时,编译器如何推断A的类型

编译器是否根据列表中定义的模板参数A的默认参数推断类型A


而类型A是分配器?

如果删除这些,则A和T仅在C上下文中已知,而在擦除模板上下文中未知。

如果删除这些,则A和T仅在C上下文中已知,而在擦除模板上下文中未知。

问题1

第一个T和A是C的参数,而不是擦除模板的参数。因此,它们对它不可见,可见的是用^^突出显示的第二个和第三个参数。请注意,第一个参数不是typename/类,而是类模板。类模板本身不是类型,只有其实例化是类型

为了更好地理解第一个T和A是如何不可见的,并且实际上不起任何作用,您可以这样重写它:

template<template<typename, typename> class C, typename T, typename A>
这样,就不会限制C模板参数的数量和意义。事实上,如果需要,这里的C可以是非模板类型。

问题1

第一个T和A是C的参数,而不是擦除模板的参数。因此,它们对它不可见,可见的是用^^突出显示的第二个和第三个参数。请注意,第一个参数不是typename/类,而是类模板。类模板本身不是类型,只有其实例化是类型

为了更好地理解第一个T和A是如何不可见的,并且实际上不起任何作用,您可以这样重写它:

template<template<typename, typename> class C, typename T, typename A>
这样,就不会限制C模板参数的数量和意义。事实上,如果需要,这里的C可以是非模板类型

erase(lst, 42)
template < class T, class Allocator = allocator<T> > class list;
template<template<typename, typename> class C, typename T, typename A>
template <typename C>
void erase(C& c, const typename C::value_type& item)
{
    c.erase(std::remove(c.begin(), c.end(), item), c.end());
}