2010-02-17 73 views
1

我正在將一個項目移植到iPhone系統,我面臨以下問題: 我有一個包含C++模板的標頭 如果我將它重命名爲.mm,它不會編譯(因爲它應該是一個標題),如果我將其保留爲.h,則將其解釋爲目標C標題在iPhone項目中的C++模板

您是否有解決此問題的解決方法?

在此先感謝!

問候,

編輯:添加錯誤消息和代碼

template <typename T> 
class CML_Matrix 
{ 
public: 
//rest of teh template 
}; 

錯誤消息是 「找不到類型名稱協議聲明」

回答

5

敷在

#ifdef __cplusplus 
//templates here 
#endif 

這樣,當文件包含在C或Objective C(.m)源文件中時,模板將被靜默忽略。

你也可以有一定的目的只有C-結構包裹在

#ifdef __OBJC__ 

編輯:你可以,或者,重命名源.mm(不是標題!)。由於它是一個混合的ObjC/C++項目,您可能必須在某個時刻實例化/調用C++類;爲此,無論如何你都需要Objective C++。雖然從來沒有嘗試過。

+0

感謝您的回答。我仍然有一個疑問:我有一個模板類定義在一個頭文件中#ifdef __cplusplus //模板在這裏 #endif 集團包裝。 如何在客觀的c應用程序中使用它? 在此先感謝! – 2010-02-18 19:50:18

+0

您不能在Objective C中使用C++模板 - 模板不是Objective C中的語言特性。然而,在Objective C++中,它們是。將源重命名爲.mm並實例化。我剛剛嘗試了一個玩具iPhone項目 - 將main.m重命名爲main.mm,並且它編譯得很好。即使在模板定義附近使用了#ifdef __cplusplus。 – 2010-02-18 20:33:44

2

其重命名爲.hpp

(這頭必須#include「由.cpp.mm文件d。將頭部的擴展意味着除了給人一種暗示的語言它使用IDE什麼都沒有。)

+0

感謝您的回答。然而,我仍然有模板的錯誤:「無法找到類型名稱的協議聲明」 – 2010-02-17 19:48:12

+1

編輯到您的問題,並*添加引起它*的代碼。 – 2010-02-17 19:59:23

+3

該頭文件必須由'.cpp'或'.mm'文件包含'#include'。頭文件的擴展意味着除了向IDE提示它使用的是什麼語言外,沒有其他意義。 – kennytm 2010-02-17 20:02:14

4

確保包含C++頭文件正在編譯爲C++或Objective-C++。 Objective-C文件(擴展名爲.m)不能成功編譯C++。將其擴展名更改爲.mm應該可以解決您的問題。