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

Jos*_*che 4 c++ c++11

让我们从代码示例开始,因为应该很容易看到发生了什么:

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()
{}
Run Code Online (Sandbox Code Playgroud)

我本来希望可以找到Base的Type别名。但是,我尝试过的所有编译器(MSVC,Clang和GCC)似乎都不喜欢此代码。

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

struct Derived : public Base<int>
Run Code Online (Sandbox Code Playgroud)

解决问题。

我可以更改一些内容以允许“派生”找到Base的别名吗?

bol*_*lov 5

因为Type是从属名称(取决于模板Base<T>)。您需要对其进行限定和使用typename。您还可以使用以下命令进行资格鉴定Derived::(由操作员自己确定):

template<typename T>
struct Derived : public Base<T>
{
    using NewType = typename Base<T>::Type;
    // or
    using NewType2 = typename Derived::Type;
};
Run Code Online (Sandbox Code Playgroud)

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

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

您如何理解C ++中的从属名称

为什么必须在何处以及为什么要放置“模板”和“类型名”关键字?

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

模板和继承出现“未在此范围内声明”错误