2016-09-23 80 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>; 
相关问题