类型<unresolved overloaded =“”function =“”type =“”> </unresolved>中的static_cast无效>

时间:2013-08-16 19:54:41

标签: c++ function-pointers 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>)’

编辑: 这是cosh函数在complex.h中的样子:

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

这是cosh函数在cmath.h中的样子:

double cosh (double x);

我已同时包含complex.hcmath.h

1 个答案:

答案 0 :(得分:4)

由于std::cosh的{​​{1}}是一个函数模板,std::complex<T>对编译器没有意义,因为&std::cosh 不是一个函数,它是函数族的模板。您需要编写另一个重载来处理这种情况:

std::cosh

顺便说一下,通过引用传递参数以避免不必要的副本。

希望有所帮助。