为什么包含在不同部分中定义的“typedef”的类会导致错误?

时间:2016-09-20 11:50:36

标签: c++11 typedef incomplete-type

我在类定义中使用“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;
};

1 个答案:

答案 0 :(得分:1)

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

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

这种情况发生了,因为编译器&#34;读取&#34; (解析)代码逐行,定义顺序很重要。