2013-10-28 230 views
0
#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

誰能告訴我爲什麼我得到這個錯誤

+1

如果未聲明原型,則不能使用對象。 前向聲明只是讓你聲明一個指針或引用。 – SHR

+0

我以爲前向聲明就像函數原型 – aah134

+0

想一想'sizeof'應該如何工作。它不可能。 – Elazar

回答

3

你不能使用對象沒有它的原型聲明。前向聲明只是讓你聲明一個指針或引用而不包含並且增加很多的依賴關係。

在頭文件中,你不需要許多不必要的包含。許多包含會導致編譯時間過長。因此,當您只需要在類或函數原型中聲明一個指針或引用時,最好使用forward聲明而不是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(); 
} 
+0

謝謝,我以爲那是怎麼回事,但我從來沒有用過前面的聲明,總是在我使用該類的任何地方使用include:D謝謝你的通關 – aah134

3

如上所述,前向聲明只讓我們聲明指針或引用。

在你的例子中,你沒有技術上需要前向聲明,因爲你可以在main函數之前聲明AAH類。