【发布时间】:2018-07-12 22:06:21
【问题描述】:
我正在尝试使用可变参数 CRTP 来创建 mixins 的一些代码。我希望将 mixin 模板化为用户选择的类型。我基本上已经尝试过了:
template <class Base>
class Feature1 {
public:
// why doesn't this work?!
// using value_type = typename Base::value_type;
public:
void extraMethod1() {
auto base = static_cast<Base&>(*this);
base.basicMethod();
}
};
template <class T, template <typename> class ... Skills>
class X : public Skills<X<T, Skills...>>... {
public:
using value_type = T;
public:
void basicMethod() {
}
};
using X1 = X<int, Feature1>;
所以我的问题是如果Base::basicMethod 可以访问,为什么我会收到Base::value_type 的错误?
错误是:
X.cpp:6:37: error: no type named 'value_type' in 'X<int, Feature1>'
using value_type = typename Base::value_type;
~~~~~~~~~~~~~~~^~~~~~~~~~
X.cpp:15:19: note: in instantiation of template class 'Feature1<X<int, Feature1> >' requested here
class X : public Skills<X<T, Skills...>>... {
clang 和 g++ 都给出类似的错误,c++ 的版本是 14 或 17(因为这只是一个实验)。
【问题讨论】:
-
我这辈子都不记得错误的原因,但我记得当涉及模板时您需要限定基类成员:
Skills<X<T, Skills...>>::basicMethod()。您可以向您的类添加using指令,以将成员带入本地范围。
标签: c++ templates crtp variadic