2016-09-23 44 views
1

簡介。我正面臨Objective-C++的一個奇怪的錯誤。我所有的文件都是正確的類型(.h/.mm而不是.hpp/.cpp)。我使用clib ++(內置於macOS Sierra上的最新版本的xCode,但它在El Capitan上是相同的),而不是libstd ++(即舊版本,甚至不完全支持C++ 11)。Objective-C++可執行文件編譯(使用.mm)

問題所在。 我無法使用頭文件和可執行文件編譯模板類。只有在整個代碼被寫入標題的情況下!

但是,如果我創建一個非模板類,即使在拆分爲2個文件時也可以正常工作。標題:

class TempClass { 
public: 
    TempClass(int x); 
    ~TempClass() {}; 
}; 

可執行文件:

TempClass::TempClass(int x) {} 

模板類代碼。部首:

template <typename T> class TempClassTemplate { 
public: 
    TempClassTemplate(T v); 
    ~TempClassTemplate() {}; 
    T val; 
}; 

可執行文件:

template<typename T> TempClassTemplate<T>::TempClassTemplate(T v) : val(v) {}; 

使用例中,引起崩潰:

int main(int argc, char * argv[]) {  
    auto obj = new TempClass(5); 
    printf("temp size is %lu\n", sizeof(obj)); 
    auto objV = new TempClassTemplate<int>(10); 
    printf("temp size is %lu, val is %i\n", sizeof(objV), objV->val); 

    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 

結果:

enter image description here

回答

0

的問題是不與目標-C或目標C++。它的純C++已知問題,但編譯器提供的信息不夠。 您只能製作模板類 - 標題。但是有一些步驟。閱讀這篇文章的完整的答案:http://www.codeproject.com/Articles/48575/How-to-define-a-template-class-in-a-h-file-and-imp

但短期和簡單的解決辦法就是寫所有可能的模板類用途中的.cpp/.mm文件中這樣結尾:

template class TempClassTemplate<int8_t>; 
template class TempClassTemplate<int16_t>; 
template class TempClassTemplate<int32_t>;