代码之家  ›  专栏  ›  技术社区  ›  ar2015

C++中的结构和类是否真的等价?

  •  3
  • ar2015  · 技术社区  · 6 年前

    假设 struct class

    #define class struct
    #include <iostream>
    
    
    int main()
    {
         return 0;
    }
    

    更新

    In file included from /usr/include/c++/7/bits/stl_algobase.h:61:0,
                     from /usr/include/c++/7/vector:60,
                     from main.cpp:5:
    /usr/include/c++/7/bits/cpp_type_traits.h:86:18: error: ‘struct std::_Sp’ is not a valid type for a template non-type parameter
       template<class _Sp, class _Tp>
                      ^~~
    compilation terminated due to -Wfatal-errors.
    
    4 回复  |  直到 6 年前
        1
  •  4
  •   Jarod42    6 年前

    class 和一个 struct

    但语法不允许 结构 在模板中:

     template <struct S> // Invalid
     /*..*/
    

     template <class C> // valid
     /*..*/
    

     template <typename T> // valid
     /*..*/
    
        2
  •  9
  •   Bathsheba    6 年前

    代码的行为是 C++标准不允许重新定义关键字。

    也许具体的失败是由于 template<class T> template<struct T> <iostream>

    (一) class struct 除了成员变量和函数的默认访问之外,在所有方面都是相同的——正如您所指出的,包括继承。

    C++标准允许您向前声明为 并作为一个整体实施 反之亦然,尽管有些编译器;例如,MSVC的旧版本;不允许这样做。)

        3
  •  0
  •   MSalters    6 年前

    定义成员时行为相同。

    class struct 并不是在任何上下文中都是同义词。

    template<class T> 是的同义词 template <typename T> . 你的 #define 会把它变成 template <struct T> ,这是不允许的。我想这就是为什么在标准头中的模板会出错。

        4
  •  0
  •   bobah    6 年前

    除了其他答案,

    要侵入私有可见性范围,最不具侵入性的方法可能是将头复制到代码库(确保它在 -I 路径),并使您的一个类成为需要黑客攻击的第三方API类的朋友。这将是我的工具,暂时修补一个次优的第三方API的生产使用。

    #define private public 在有限的范围内。这个我可能不会在生产代码库中做。