V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wutiantong
V2EX  ›  C

define nested class in template class

  •  
  •   wutiantong · 2018-11-13 10:44:15 +08:00 · 2103 次点击
    这是一个创建于 2204 天前的主题,其中的信息可能已经有所发展或是发生改变。
    template<typename T>
    struct base
    {
        struct usage : public base
        {
    
        };
    };
    

    这样的代码用 clang 编译没问题,用 gcc8.2 会产生一个 warning:

    warning: invalid use of incomplete type 'struct base<T>'

    标准是怎么说的呢?

    10 条回复    2018-11-16 18:18:57 +08:00
    shylockhg
        1
    shylockhg  
       2018-11-13 14:17:28 +08:00
    继承的 base 需要特化
    shylockhg
        2
    shylockhg  
       2018-11-13 14:21:30 +08:00
    @shylockhg 说特化不太准确,struct usage : public base<T>
    wutiantong
        3
    wutiantong  
    OP
       2018-11-13 16:41:08 +08:00
    @shylockhg 不是这样的,在这里加不加<T>是没有区别的,直接看在线代码吧: https://godbolt.org/z/uotlFp
    shylockhg
        4
    shylockhg  
       2018-11-13 16:44:58 +08:00
    @wutiantong 消除警告
    wutiantong
        6
    wutiantong  
    OP
       2018-11-13 17:27:35 +08:00
    @shylockhg 你好像没有抓住重点。。。

    我要讨论的情况下
    enclosing class 是 template class
    这将会允许我们在其中直接定义 inherit nested class

    实际上,clang 和 gcc 都能编译通过这样的代码,但 gcc 会额外的产生 warning
    更保守的写法(把 nested class 定义在后面)可以消除 warning

    但我想知道的是原写法到底符不符合标准?
    shylockhg
        7
    shylockhg  
       2018-11-13 17:48:51 +08:00
    @wutiantong 这就不清楚了,你要是搞清楚了可以分享下
    FrankHB
        8
    FrankHB  
       2018-11-14 02:33:12 +08:00   ❤️ 1
    按现在的说法:
    http://eel.is/c++draft/temp.inst#1
    没有明确类模板定义之后实例化之前的实例就是不完整类型,不过本来就是要求在完整类型的上下文中实例化,所以姑且没什么疑问。
    http://eel.is/c++draft/temp.point#4
    但是这里要求实例化的顺序就有问题了,嵌套的类总是在之前实例化,于是这里根本就没外面这个类的定义,而 base<T>这样的形式倒是被 http://eel.is/c++draft/temp.names#7 明确为类型名,所以是不完整类型。这是 G++报警告的原因。

    实际上这是一个十几年来未解决的 CWG issue:
    https://wg21.cmeerw.net/cwg/issue287

    按理想的解决方向就是 Clang++和 VC++这样的直接允许。

    另见:
    https://stackoverflow.com/questions/37742749/point-of-instantiation-of-a-template-class

    不过就这个例子,解决以后和非模板的情形还是不一样。非模板肯定还是不完整类型。和模板不同,因为根本没法在这里补充完整,还是会报错。
    wutiantong
        9
    wutiantong  
    OP
       2018-11-14 14:02:18 +08:00
    @FrankHB 感谢大佬
    FrankHB
        10
    FrankHB  
       2018-11-16 18:18:57 +08:00
    今天又被坑了。。。G++7/8 没问题,Clang++7 不干了……

    https://bitbucket.org/FrankHB/yslib/src/4ed6f283887b299b36896e9438674eab61008ffa/YBase/include/ystdex/range.hpp?fileviewer=file-view-default#range.hpp-297

    还好刚对付过这个问题……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2668 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:32 · PVG 23:32 · LAX 07:32 · JFK 10:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.