为什么派生类找不到基类的类型别名?



让我们从代码示例开始,因为应该很容易看到正在发生的事情:

template <typename T>
struct Base
{
    using Type = int;
};
template<typename T>
struct Derived : public Base<T>
{
    // error: unknown type name 'Type'
    using NewType = Type;
};
int main()
{}

我本来可以预期会找到基本的类型别名。但是,我尝试过的任何编译器(MSVC,Clang,GCC(似乎都喜欢此代码。

更令人惊讶的是,将派生的继承更改为:

struct Derived : public Base<int>

解决了问题。

我可以更改一些东西以允许派生以找到基本的别名吗?

,因为 Type是一个因名称(这取决于模板Base<T>(。您需要资格并使用typename。您也可以使用Derived::资格(正如OP本人弄清楚的那样(:

template<typename T>
struct Derived : public Base<T>
{
    using NewType = typename Base<T>::Type;
    // or
    using NewType2 = typename Derived::Type;
};

您可以在此处阅读有关依赖名称的更多信息:

https://en.cppreference.com/w/cpp/language/depperentent_name

您如何理解C 中的相关名称

我必须在何处以及为什么要放置"模板"one_answers" typename"关键字?

为什么我必须通过此指针访问模板基类成员?

"在此范围中未声明"模板和继承的错误

最新更新