2012-04-09 2 views
0

Я пытаюсь перенести проект C++ в iOS. Он отлично компилируется в QtCreator на Linux и Windows, а также на MSVC. Теперь на Xcode/GCC с определенным шаблоном я получаю следующую ошибку: «error: too few template-parameters-lists».Ошибки шаблона GCC

Код, который вызывает эту ошибку выглядит примерно так:

template <typename TA, typename TB, int Type> 
class MyClassImpl 
{ 
public: 
    MyClassImpl(); 
    virtual int GetType() const 
    { 
     return type; 
    } 
};  

typedef MyClassImpl<float, int, 12> MyFloatIntClass; 

MyFloatIntClass::MyFloatIntClass() 
{ 
... 
} 

int MyFloatIntClass::GetType() const 
{ 
    return 22; 
} 

Я предполагаю, что-то о синтаксисе ЬурейеГо является незаконным и GCC является более строгим по стандарту. Может кто-нибудь сказать мне, в чем проблема, и как я могу это исправить?

+0

Если это копия/паста вашего реального кода, вам не хватает ',' после класса до 'typedef'. – dasblinkenlight

+0

нет. :) [отредактировал] – iOSPorter

ответ

3

Это всего лишь предположение, но вам нужно добавить шаблон <>?

Поскольку это специальность шаблона, я считаю, что это все еще должен быть шаблон.

ex.

template<> 
MyFloatIntClass::MyClassImpl() {} 

template<> 
int MyFloatIntClass::GetType() const { 
    return 22; 
} 

EDIT: От ответа- modelnine превращается из него нужно untypedef'd имя для CTOR.

EDIT2: Следующий код работает для меня:

template <typename TA, typename TB, int Type> 
class MyClassImpl 
{ 
public: 
    MyClassImpl(); 
    MyClassImpl(const MyClassImpl<TA, TB, Type>&); 
    virtual int GetType() const 
    { 
     return Type; 
    } 
    const MyClassImpl<TA, TB, Type>& operator=(const MyClassImpl<TA, TB, Type>&); 
};  

typedef MyClassImpl<float, int, 12> MyFloatIntClass; 

template<> 
MyFloatIntClass::MyClassImpl() 
{ 
// 
} 

template<> 
MyFloatIntClass::MyClassImpl(const MyFloatIntClass& rhs) 
{ 
// 
} 

template<> 
const MyFloatIntClass& MyFloatIntClass::operator=(const MyFloatIntClass& rhs) 
{ 
    return *this; 
} 

template<> 
int MyFloatIntClass::GetType() const 
{ 
    return 22; 
} 
+0

Я пробовал это, но это определенно делает его еще хуже. Я думаю, если я добавлю шаблон <>, компилятор подумает, что я хочу определить еще один шаблон. – iOSPorter

+0

см. Ответ моделина - это лучше, чем у меня. –

+0

@iOSPorter: Эти копии копий работают на вас? Вам нужно полностью указать тип rhs для MyClassImpl или вам понадобится двойной шаблон. –

4

Как вы определяете полные специализации методов соответствующего класса, вам все равно нужно префикс определения с template <>, который является «шаблоны-параметры-списки» вам не хватает. Кроме того, конструктор должен быть назван как класс, поэтому MyFloatIntClass::MyFloatIntClass() является незаконным (поскольку MyFloatIntClass - это просто псевдоним, а не имя класса). Ниже компилируется нормально для меня (г ++ 4.5.3):

template <typename TA, typename TB, int Type> 
class MyClassImpl 
{ 
public: 
    MyClassImpl(); 
    virtual int GetType() const 
    { 
     return Type; 
    } 
};  

typedef MyClassImpl<float, int, 12> MyFloatIntClass; 

template <> 
MyFloatIntClass::MyClassImpl() 
{ 
} 

template <> 
int MyFloatIntClass::GetType() const 
{ 
    return 22; 
} 
+0

Такие работы, спасибо! Но: не для всех случаев. У меня также есть конструктор копирования и оператор =, и я не знаю, как с ними справиться. Я обновлю исходный код примера для просмотра. потерпите меня. – iOSPorter

+0

Спасибо, вот и все. У меня все еще есть некоторые проблемы с этим классом шаблонов, но, я думаю, я открою для них еще одну проблему. Большое спасибо! – iOSPorter

Смежные вопросы