为什么我们不能重复使用具有不同模板参数的别名模板标识符?
Why can we not reuse an alias template identifier with different template parameters?
以以下示例(https://godbolt.org/z/ouX3Vz
(:template<typename T>
using A = T;
template<typename T, typename V>
using A = V; // Why is this not allowed?
template<typename T>
void B() {}
template<typename T, typename V>
void B() {} // Yet this is allowed?
int main() {
A<int> hello = 10; // Allowed, T=int
A<double> world = 20.0; // Allowed, T=double
// A<int, int> bad = 20; // Not allowed, T=int, V=double?
B<int>();
B<int, int>();
}
由于参数不同,我们允许有两个用于B
的函数模板,但是,尽管参数不同,我们不允许有两个用于A
的别名模板。
这是标准中的疏忽还是我缺少的理由?是否有任何描述此行为的标准参考?
您可以定义多个具有相同名称的函数模板,因为函数可能会相互重载。如果允许函数重载,但不允许函数模板重载,那么这将是使用模板的严重障碍。
没有必要允许同一范围内的多个类模板具有相同的名称,因为对于这样的功能,单个可变参数模板尚未解决的用例并不多,并且会使语言更加复杂。(例如,考虑以后无法引用集合中的一个特定模板。类似的语句适用于别名模板。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- C++模板模板参数中未声明的标识符
- 为什么我的一个宏参数被替换为')'而不是标识符?
- 为什么在函数参数编译中没有标识符的const关键字
- 在检查传递函数标识符时是否获得模板参数时遇到问题
- 函数参数中未声明和未定义的标识符
- 可变参数模板的未声明标识符
- 不存在的标识符在非启用函数模板中用作默认参数
- 'itoa':函数不带1个参数&'c':未声明的标识符
- 未声明的标识符 (newGame) - 指向函数作为参数的指针
- 函数参数中未声明的标识符
- C++编译错误:未定义的标识符(用于函数参数)
- 找不到标识符,即使使用依赖于参数的查找和运算符<<也不明确
- c++类成员与成员函数参数相同的标识符
- 找不到c++函数参数标识符