Jos*_*vin 3 c++ templates g++ clang++ c++14
我最近将一个类从模板更改为不,并发现在编写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;
}
Run Code Online (Sandbox Code Playgroud)
这是标准的.
N4140 [temp.dep]/3:
在类或类模板的定义中,如果基类依赖于模板参数,则在类模板或成员的定义点或在实例化实例化期间,不会在非限定名称查找期间检查基类作用域.类模板或成员.
因为buzz
,基类依赖于模板参数,因此foo
非限定查找不会检查其范围.这就是您需要合格查找的原因.
归档时间: |
|
查看次数: |
54 次 |
最近记录: |