【问题标题】:Why may class which contains "typedef" defined in different parts lead to error?为什么包含在不同部分定义的“typedef”的类会导致错误?
【发布时间】:2016-09-20 11:50:36
【问题描述】:

我在类定义中使用了“typedef”,但是当这个类出现在不同的位置时,它的执行方式不同,可能会导致错误。请帮我检查以下代码。

这个版本的代码可能会报错:

#include <vector>
#include <string>
class B;
class A 
{
    public: 
        A() { }
        std::vector<B::size_type> vec;
};
class B
{
    public: 
        typedef std::vector<std::string>::size_type size_type; // [Error] incomplete type 'B' used in nested name specifier
};

但以下代码运行正常:

#include <vector>
#include <string>
class B
{
    public: 
        typedef std::vector<std::string>::size_type size_type;
};
class A 
{
    public: 
        A() { }
        std::vector<B::size_type> vec;
};

【问题讨论】:

  • 因为代码是按顺序解析的(从上到下)。在第一个版本中,B 仅是前向声明的,并且 typedef 是未知的。在第二个版本中,B 在使用 typedef 之前已经完成。

标签: c++11 typedef incomplete-type


【解决方案1】:

问题不在于typedef本身,而在于定义的顺序。

在第一个代码 sn-p 中,编译器不知道这个B::size_type 是什么——它只知道存在一个class B。在后一种情况下,编译器已经知道你的typedef,因此B::size_type

发生这种情况是因为编译器逐行“读取”(解析)代码,并且定义的顺序很重要。

【讨论】:

  • 除了调整类定义的顺序,我还能做些什么来避免这种错误呢?使用朋友类?
  • @Vogel_guo - 不,你无能为力。也许将类拆分为不同的标题,但是includes 以同样的方式很重要。定义符号的顺序很重要。此外,这些错误是编译时的,所以它们在任何方面都没有危险(在运行时)
  • 好的,经过你的解释,我想我现在明白了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多