【发布时间】:2021-01-08 06:55:51
【问题描述】:
关于派生类中的嵌套类型不应在 CRTP 中使用的讨论很多。但是,以下一些情况实际上可以正常工作:
template <class T>
class Base {
public:
int value = T().value;
};
template <class T>
class B {
public:
// case 1: ok, as long as class C does not instantiate;
class C : public T::I {};
// case 2: bad, class C instantiated;
// class C : public T::I {};
// C c;
// case 3: bad,
// typedef typename T::I TI;
// case 4: bad, similarly, even T::I is used as template parameter
// typedef Base<typename T::I> BaseTI;
// case 5: if used as function parameter type, make a trivial template
template <typename R,
typename = std::enable_if_t<std::is_same_v<T, typename R>::type>>>
auto get(R n) { return n; }
};
class D : public B<D> {
public:
class I {
public:
int value;
};
I i;
};
我认为 2、3、4 失败的原因是编译器的 2 阶段名称查找;我也可以推断案例 5 是可以的,因为只有当 B::<T>::get<R> 被调用时,它才会得到解决。但是,我不明白为什么案例 1 运行良好,尤其是给定的案例 2 无法编译。
为什么 1 和 2 不同?
【问题讨论】:
标签: c++ crtp dependent-type