2013-08-16 2 views
2

я написал следующую функцию применять различные математические операции для каждого элемента вектора:Invalid static_cast от типа <нерешенным перегружен тип функции>

namespace MYFUNCTION 
{ 
    template<class T> 
    std::vector<T> eop(const std::vector<T> &v1, T (*f)(T)) 
    { 
     std::vector<T> v2(v1.size()); 
     for(int ii = 0; ii < v1.size(); ii++) 
     { 
      v2[ii] = (*f)(v1[ii]); 
     } 
     return v2; 
    } 
} 

Я также перегруженной функции cosh() для std::vector параметров:

namespace MYFUNCTION 
{ 
    template<class T> 
    std::vector<T> cosh(const std::vector<T> v1) 
    { 
     return eop(v1,static_cast<T (*)(T)>(&std::cosh)); 
    } 
} 

Если я использую эту функцию для типа double, все будет в порядке. Если я использую std::complex<double>, вместо этого получаю ошибку компилятора.

std::vector<double> a(2); 
a[0] = 1.0; 
a[1] = 2.0; 
std::cout << MYFUNCTION::cosh(a) << std::endl; // Works fine. 

std::vector<std::complex<double> > b(2); 
b[0] = 1.0 + std::complex<double>(0.0,1.0); 
b[1] = 2.0; 
std::cout << MYFUNCTION::cosh(b) << std::endl; // Compiler error. 

Ошибка компилятора:

error: invalid static_cast from type ‘<unresolved overloaded function type>’ to type ‘std::complex<double> (*)(std::complex<double>)’ 

EDIT: Это то, что функция cosh выглядит в complex.h:

template<class T> complex<T> cosh (const complex<T>& x); 

Это то, что функция cosh выглядит в cmath.h:

double cosh (double x); 

Я включил оба complex.h и cmath.h.

ответ

4

С std::cosh для std::complex<T> шаблон функции, &std::cosh не имеет смысла, потому что компилятор std::cosh является не функция, это шаблон семейства функций. Вам нужно написать еще одну перегрузку обрабатывать этот случай:

Кстати, передать аргумент, ссылкой, чтобы избежать ненужных копий.

Надеюсь, что это поможет.

+1

Это исправило мою проблему, спасибо! – OSE

+0

@leemes: это была опечатка. – Nawaz

+0

@Nawaz Хорошо, спасибо, что посмотрели на него :) – leemes

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

  • Нет связанных вопросов^_^