2013-01-14 60 views
0

我有一個庫是抽象的,基本上是這樣的:通過在C抽象庫++

namespace N { 
    class A 
} 

了Bh

#pragma once 
#ifndef B 
#define B 
#include "A.h" 
namespace N { 
    class B: Public A 
} 
#endif 

中,庫中CMakelists引用。 txt like this:

global_add_library(libN A.cpp B.cpp) 
target_link_libraries(libN someLibraries) 

現在我有main文件看起來像這樣:

#include <libN/A.h> 
#include <libN/B.h> 

N::A a* = new A(); 
N::B b* = new B(); 

而且它CMakelists.txt看起來是這樣的:

global_add_exectubale(application somemainccpfiles.cpp) 
target_link_libraries(application libN) 

什麼,我得到的是一個錯誤說

error: ISO C++ forbids deceleration of 'B' with no type. 

所以我我以爲Bh文件沒有正確包含?但爲什麼當A的減速度恰好?

任何想法?

編輯:所以我發現原來的問題是什麼,pragma onceifndef的組合意味着它沒有正確編譯。當它被修復後,我刪除了雜注。但現在的問題是爲什麼呢?它們不應該在兩者都起作用嗎?

+1

鑑於這一切都不是真實的代碼,這是很難說...... –

+0

@OliCharlesworth你是怎麼知道的: 0,但是,是的,我不能發佈我的真實代碼,導致我的工作的一部分,並有IP限制。但是我對包含內容沒有做任何明顯的錯誤? –

+0

預處理過程中可能出現錯誤嗎?也許包括衛兵的問題? – goji

回答

1
#include "A.h" 
namespace N { 
    class B: Public A 
} 

你列入「啊」,但在其他文件中,這是「libN /啊」

+0

但是如果'B.h'和'A.h'在同一個文件夾中,'B.h'應該可以說'A.h'(沒有'libN /'部分)。 – Cornstalks

+0

這是正確的,因爲即時通訊使用CMake的代碼是在不同的目錄,因此我已經將它設置爲像圖書館一樣添加。 –