Objective-C ++可执行文件编译(带.mm)

时间:2016-09-23 11:16:21

标签: xcode templates std linker-errors objective-c++

介绍。我在使用Objective-C ++时遇到了一个奇怪的错误。我的所有文件都是正确的类型(.h / .mm而不是.hpp / .cpp)。我使用clib ++(内置于macOS Sierra的最新版本的xCode,但它在El Capitan上的方式相同)而不是libstd ++(这是较旧的,甚至不完全支持C ++ 11)。

问题所在。 我无法使用标头和可执行文件编译模板类。仅在整个代码写入标题的情况下!

但是,如果我创建一个非模板类,即使分成2个文件也可以正常工作。部首:

L11

可执行文件:

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) {};

结果:

enter image description here

1 个答案:

答案 0 :(得分:0)

问题不在于Objective-C或Objective-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>;