命名空间中的类前向声明

时间:2013-10-28 23:38:44

标签: c++ namespaces forward-declaration

#include <iostream>
#include <string>
#include <vector>

using std::string;
using std::vector;
using std::endl;
using std::cout;

namespace AAH 
{
    class messageTemplate;
};

using namespace AAH;

int main()
{
    messageTemplate templateMSG32("hello world");
    cout << templateMSG32.version << endl;
    return EXIT_SUCCESS;
}

namespace AAH {    
    class messageTemplate 
    {
    public:
        messageTemplate() : version("XX.XX.XX.001") {}
        messageTemplate(string ver) : version(ver) {}
        string version;
    };
};

好的,这是代码,

我收到错误消息:

Error 3 error C2228: left of '.version' must have class/struct/union

我正在使用visual studio 2012

任何人都可以告诉我为什么会收到此错误

2 个答案:

答案 0 :(得分:4)

如上所述,前向声明只允许你声明指针或引用。

在您的示例中,您在技术上不需要前向声明,因为您可以在主函数之前声明AAH类。

答案 1 :(得分:3)

如果未声明原型,则无法使用对象。前向声明只是为了让你声明一个没有包含的指针或引用并添加很多依赖项。

在头文件中,您不需要许多不必要的包含。许多包含会导致编译时间过长。因此,当您只需要在类或函数原型中声明指针或引用时,最好使用前向声明而不是include。

看一下样本:

档案A.h

class A{
public:
    void func() const;
};

档案B.h

//fwd declaration instead of include
class A;

class B{
public:
  //use fwd decl.
  B(const A& a);
};

文件B.cpp

#include "B.h"
#include "A.h" //have to include since I using the obj.
B::B(const A& a){
   a.func();
}