C++ 为什么可以';t我的派生类找到我的基类';s型别名?

C++ 为什么可以';t我的派生类找到我的基类';s型别名?,c++,c++11,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() {} 模板 结

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

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()
{}
模板
结构基
{
使用Type=int;
};
模板
结构派生:公共基
{
//错误:未知的类型名称“type”
使用NewType=Type;
};
int main()
{}
我本来希望派生可以找到Base的类型别名。然而,我尝试过的编译器(MSVC、Clang、GCC)似乎都不喜欢这段代码

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

struct Derived : public Base<int>
struct派生:公共基
解决了这个问题


是否可以更改某些内容以允许派生查找Base的别名?

,因为
Type
是一个从属名称(它取决于模板
Base
)。您需要限定它并使用
typename
。您还可以使用
派生::
对其进行限定(正如用户自己所理解的):

模板
结构派生:公共基
{
使用NewType=typename Base::Type;
//或
使用NewType2=typename派生::Type;
};
您可以在此处阅读有关从属名称的更多信息:


此外,这是我关于堆栈溢出的第一个问题,请告诉我是否有什么可以改进的地方!在清晰的问题陈述上做得很好,并对答案表示完美的感谢;上下文的缺乏解释了为什么它不能理解类型——据它所知;基类将被专门化以具有完全不同的内容。不过,您的解决方案依赖于我们了解类型的来源。通过查看上一个链接,我想到了使用NewType=typename-Derived::Type使多重继承等更容易。你介意把它添加到你的解决方案中吗?“这对我的处境会有很大帮助。”约书亚·梅切说得没错。同样是的,我同意
Derived::Type更好。抢手货
template<typename T>
struct Derived : public Base<T>
{
    using NewType = typename Base<T>::Type;
    // or
    using NewType2 = typename Derived::Type;
};