c++ - 在 C++ 中使用附加模板参数扩展模板结构
问题描述
template< typename T >
struct A {
};
template< typename T, typename U >
struct A : A<T> {
};
int main() {
A<double> ad;
A<int, int> a;
}
编译错误
g++ -std=c++17 -Wall -pedantic -pthread main.cpp && ./a.out main.cpp:9:8: error: redeclared with 2 template parameters struct A : A<T> { ^ main.cpp:4:8: note: previous declaration 'template<class T> struct A' used 1 template parameter struct A { ^ main.cpp: In function 'int main()': main.cpp:16:5: error: expected initializer before 'A' A<int, int> aii; ^
不同的模板名称工作正常:
template< typename T >
struct A {
};
template< typename T, typename U >
struct AA : A<T> {
};
int main() {
AA<int, int> aa;
}
想要相同的模板名称。使用可变参数模板应该是可能的,但我不知道如何。
感谢您的关注
解决方案
如果可以定义默认值,则可以使用默认参数:
template<typename T, typename U = /* default */>
struct A {
};
如果您想处理具有不同行为的不同数量的模板参数,您还可以使用可变参数模板和专门化:
template<typename...>
struct A;
template<typename T>
struct A<T> { // specialization for one parameter
};
template<typename T, typename U>
struct A<T, U> { // specialization for two parameter
};
int main() {
A<double> ad;
A<int, int> a;
// A<int, int, int> a; // error, undefined
}
推荐阅读
- listview - 将列表视图中的选定项目绑定到文本框一种方式无法按预期工作
- authentication - 如何在输入框内插入提示 - Tkinter Entry Widget
- android - Android App 在 material.textfield.TextInputLayout 崩溃
- android - 伴奏 FlowRow :是否可以自动向下滚动以显示元素?
- html - 图片不直接显示
- embedded - 在嵌入式中刷新某些东西是什么意思?
- bash - 给定 SQS 的工作量,如何创建用于自动缩放 EC2 实例的 bash 脚本?
- java - 在活动之间传递微调器数据并使用给定数据的 if 语句
- android-recyclerview - 在recyclerview中显示gridview
- c - 程序调用 printf() 然后永远循环。为什么我看不到 printf 输出?