首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在特定方法和一般类中的“使用类型”语法有什么不同?

在特定方法和一般类中的“使用类型”语法有什么不同?
EN

Stack Overflow用户
提问于 2021-06-23 06:33:52
回答 1查看 43关注 0票数 1
代码语言:javascript
复制
template<class Derived>
class Base{
    public:
        using dType = typename Derived::Type; //1
        void interface(){
            using dType = typename Derived::Type; //2
        }
};
template<typename T>
class Derived:public Base<Derived<T>>{
    public:
        using Type = T;
};

int main(){
    Base<Derived<int>>{};
    return 0;
}

当我在(1)中使用'using‘语法时,我得到如下错误

代码语言:javascript
复制
test.cpp: In instantiation of 'class Derived<int>':
test.cpp:14:9:   required from 'class Base<Derived<int> >'
test.cpp:31:21:   required from here
test.cpp:23:7: error: invalid use of incomplete type 'class Base<Derived<int> >'
   23 | class Derived:public Base<Derived<T>>{
      |       ^~~~~~~
test.cpp:12:7: note: declaration of 'class Base<Derived<int> >'
   12 | class Base{
      |

但是,当我在(2)中使用它时,我没有错误。它们有什么不同?

EN

回答 1

Stack Overflow用户

发布于 2021-06-23 07:42:01

当类本身完全定义时,成员函数将在过程中稍后实例化。(因为类模板的成员函数只有在实际使用时才会被实例化,并且它们只能在完整类型或这些类型的实例上使用),要实现这一点,类必须是完整类型。

然而,当Base被实例化时,Derived本身是一个不完整的类型(因为基类必须先实例化,然后派生类才能确定其布局),因此在Base中,它不能查看derived,因为Derived是不完整的。它只是过早地检查了它的模板类型,所以它是有效的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68091413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档