2013-12-19 65 views
0

我在文件base.hC++繼承錯誤:預期的類名前「{」令牌

#ifdef _BASE_H_ 
#define _BASE_H_ 

class base { 
    public: 
    int base_data; 
}; 
#endif 

和派生類有一個基類

#include "base.h" 

class derived: public base { 
    public: 
    int derived1_data; 
    inline void set(int data) { derived1_data = data;} 
}; 

當我嘗試編譯我得到這個錯誤:

 
error: expected class-name before ‘{’ token 

我不知道我在做什麼錯在這裏。

+1

您正在使用[保留標識符](http://stackoverflow.com/questions/228783/what-are-the-rules-about -using-an-underscore-in-ac-identifier),並且答案的建議仍然適用。 – chris

回答

1

問題出在你頭文件的第一行#ifdef _BASE_H_。它應該是#ifndef _BASE_H_(注意額外的「N」

這裏是正在發生的事情的簡要說明:

#ifdef MACRO_NAME 
    <line 1> 
    <line 2> 
    ... 
#endif 

此代碼告訴C++預處理器僅包括一號線第2行,...在源代碼中,如果在此之前定義了一個宏MACRO_NAME(注意:它只是宏定義的重要部分,而不是它的值,如果您想要預測代碼包含宏值,可能使用#if

您試圖在此處使用的技術稱爲Include Guard,它可以防止重複包含代碼(主要由#include預處理器指令)。這個想法包括頭文件的源代碼只有當一些宏(比如說「M」)還沒有被定義,然後在頭文件代碼中,第一件事就是定義宏「M」(這樣下一次撥打#include samefile將不再包含其代碼)。爲了創建一個包含守護進程,您需要使用#ifndef預處理程序指令(與#ifdef完全相反,實際上,額外的n代表「NOT」)。

由於您錯誤地使用了#ifdef,因此從未包含文件base.h(因爲您唯一定義宏_BASE_H_的地方是在檢查它已被定義之後!)。因此,編譯器不知道類base,導致錯誤expected class-name before ‘{’ token

3

變化

#ifdef _BASE_H_ 

於首

#ifndef _BASE_H_ 
2

變化

#ifdef _BASE_H_ 

#ifndef _BASE_H_ 
4

#ifdef _BASE_H_應該是#ifndef _BASE_H_

或者乾脆用#pragma once :)

1

不顧事實,即宏的名稱不應以下劃線開始,你在「頭文件保護」

#ifdef _BASE_H_ 

這將是錯誤只有編譯的東西高達#endif如果宏是已經定義,與你想要做的相反。這就是爲什麼你應該寫

#ifndef _BASE_H_ 

基本上忽略的東西最多#endif如果宏已經定義,也就是,如果該文件是已經包含的情況。

但是你的編譯器無法檢測到這是真正的問題。相反,它默默地忽略頭文件base.h的內容,這意味着基類永遠不會被定義(它不會找到源代碼!)。所以到達線

class derived : public base { 

時,編譯器不知道類型base,這意味着你不能從它派生的,因此一個類名,預計該錯誤消息。

相關問題