2016-09-23 9 views
1

Введение. Я сталкиваюсь с странной ошибкой с Objective-C++. Все мои файлы имеют правильный тип (.h/.mm вместо .hpp/.cpp). Я использую clib ++ (встроенный в xCode последней версии на macOS Sierra, но он был таким же образом на 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

Проблема не с 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>;