使类模板化会强制在继承构造函数中重复基类模板参数
Making class templated forces repeating base class template params in inheriting constructor
我最近将一个类从模板化改为不模板化,并发现在编写using声明以从模板化基类继承构造函数时,我不能再省略模板参数。只要我的类没有模板化,我就可以省略参数,只要是,我就不能。在下面的可编译代码段中,bar
表示前面的类,buzz
表示后面的类。我测试了GCC 5.2和Clang 3.7,它们有相同的行为。这是编译器错误还是标准错误?
#include <iostream>
template<class A, class B>
struct foo {
foo(int x) {
std::cout << x << std::endl;
}
};
struct bar : foo<bar, short> {
using foo::foo; // this appears legal
// using foo<bar, short>::foo; // this works too, thought I would need it
};
template<class X>
struct buzz : foo<buzz<X>, short> {
//using foo::foo; // no longer legal for some reason
using foo<buzz<X>, short>::foo; // now do actually need this
};
int main() {
bar x(3);
buzz<float> y(5);
return 0;
}
这是标准配置。
N4140 [temp.dep]/3:
在类或类模板的定义中,如果基类依赖于模板参数,则基类在类模板的定义点进行非限定名称查找时,也不会检查作用域或者在类模板或成员的实例化期间。
对于buzz
,基类依赖于模板参数,因此foo
非限定查找不会检查其范围。这就是为什么您需要合格的查找。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 参数包构造函数在类模板中隐藏用户定义的转换
- 具有已删除移动和复制构造函数的类的就地构造
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- C++构造函数和类?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 如何在其他类中使用参数化构造函数制作类的对象?
- 具有值包装器的可变参数模板构造函数的类构造函数优先级
- 如何使用私有构造函数对类进行单元测试?
- C++虚拟函数:基类函数是调用的,而不是派生的
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 从作为模板参数传递给构造函数的类继承,或者从它们继承
- 继承的构造函数忽略类内初始化
- 模板和隐式构造函数的类定义之外的友元声明
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 为什么具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基继承?
- 具有多个非默认构造函数基的Singleton派生类
- 调用基默认构造函数模板类
- 当基类未指定构造函数时,如何使用仅具有带参数的构造函数的类派生基类?
- 构造所有基类不需要默认生成的构造函数