2014-01-29 4 views
0
template <int C> class MyClass; 

...  


template <int C> 
double trans(MyClass<C> &a) 
{ 
    //return some double 
} 

//this is supposed to be function template 
template <int C> 
double func(MyClass<2> &a) 
{ 
    //return some double 
} 

template <int C> 
MyClass<C-1> func(MyClass<C> &a) 
{ 
    MyClass<C-1> ret; 
    return ret; 
} 

template <int C> 
double otherFunc(MyClass<C> &a) 
{ 
    double result; 
    if(C == SOME_CONSTANT) 
     result = func(a); 
    else 
     result = trans(func(a)); 

} 

Что моя проблема, я хочу, чтобы проверить аргумент шаблона C в параметре otherFunc шаблона функции вызова func (вернуться дважды) вместо функции члена шаблона класса func (возврат MyClass). Но почему-то компилятор попытки func, который возвращает MyClass вC++, используя шаблон функции в шаблоне класса

 if(C == SOME_CONSTANT) 
     result = func(a); 

эту часть, так что я получил ошибку компиляции (потому что двойной = MyClass не является жизнеспособным). Как мне исправить эту проблему?

+1

'otherFunc' должен быть законным компилировать для значений' C' это экземплярам с - что * включает в себя * филиал в 'if' /' else', который никогда не может быть использован для этого значения 'C'. Другими словами, даже если 'SOME_CONSTANT'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' , Как исправить? - вы можете избежать 'if' /' else' с помощью havnig общего шаблона 'otherFunc' для' C! = 2' и специализации для '2'. Не совсем понятно, что вы действительно пытаетесь достичь, хотя ... –

+0

Я просто хочу, чтобы 'func' вел себя немного иначе, чем C == 2. Я был бы признателен, если бы вы могли разработать бит больше – REALFREE

ответ

0

Трудно уточнить в комментарии, поэтому я отправлю ответ. Напомним, что я сказал в комментариях:

  • вы не можете иметь в otherFunc в if/else, что не будет законно собрать для конкретного экземпляра MyClass,
  • вы может использовать такой же подход специализации шаблона для создания альтернативы otherFunc определение для обработки MyClass<2> s.

Пример кода:

#include <iostream> 

template <int C> 
class MyClass 
{ }; 

template <int C> 
double trans(const MyClass<C> &a) 
{ 
    return C + 700; 
} 

template <int C> 
MyClass<C-1> func(MyClass<C> &a) 
{ 
    MyClass<C-1> ret; 
    return ret; 
} 


double func(MyClass<2>& a) 
{ 
    return 200.0; 
} 

template <int C> 
double otherFunc(MyClass<C> &a) 
{ 
    return trans(func<C>(a)); 
} 

template <> 
double otherFunc<2>(MyClass<2>& a) 
{ 
    return func(a); 
} 


int main() 
{ 
    MyClass<2> a; 
    std::cout << otherFunc(a) << '\n'; 

    MyClass<4> b; 
    std::cout << otherFunc(b) << '\n'; 
} 

Выход:

200 
703 
+0

Спасибо, я все еще пытаюсь изучить шаблон в C++:/I cann ' t получить представление о специализации – REALFREE

+0

@REALFREE: синтаксис требует некоторого привыкания к ;-). –

+0

О, btw У меня есть еще один вопрос, поэтому вы удаляете шаблон из double func (MyClass <2> & a), это еще функция шаблона класса? – REALFREE

0

Я думаю, причина в том, что:

if(C == SOME_CONSTANT) 
    result = func(a); 
else 
    result = trans(func(a)); 

проверяется во время выполнения, в то время как шаблон специализаций и проверка типов производится во время компиляции. Эти 2 функций:

template <int C> 
double func(MyClass<2> &a) 
{ 
    //return some double 
} 

template <int C> 
MyClass<C-1> func(MyClass<C> &a) 
{ 
    MyClass<C-1> ret; 
    return ret; 
} 

имеют почти те же подписи - единственное отличие состоит в том, что для C==2 используется один возвращающийся double, в противном случае используется один возвращающийся MyClass<2>. Так что вы получаете:

// for C==2 
if(C == SOME_CONSTANT) 
    result = func<2>(a); // returns double - just like you wanted 
else 
    result = trans<2>(func<2>(a)); // pass double into trans<?>(MyClass<?>), so the parameter cannot be resolved unless you specified some implicit constructor/explicit conversion operator 

// for e.g. C==3 
if(C == SOME_CONSTANT) 
    result = func<3>(a); // returns MyClass<2> while result is double 
else 
    result = trans<2>(func<3>(a)); // pass MyClass<2> into trans<?>(MyClass<>) - like you wanted 

поэтому в основном ваш код имеет неверный тип для специализации в первом или втором случае. Вы можете сделать что-то вроде этого, вместо:

template <> 
MyClass<2> func<2>(MyClass<2> &a) 
{ 
    return a; 
} 

template <int C> 
MyClass<C-1> func(MyClass<C> &a) 
{ 
    return MyClass<C-1>; 
} 

держать тип шаблонов последовательно, а затем:

if(C == SOME_CONSTANT) 
    result = trans(a); 
else 
    result = trans(func(a)); 

Это просто пример того, как справиться с этим. Все должно быть проще, если вы избегаете возиться с другим возвратом, напечатанным для разных специализированных шаблонов.

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