C++ c++;语法:请求从某些\u类型转换为非标量\u类型时出错

C++ c++;语法:请求从某些\u类型转换为非标量\u类型时出错,c++,C++,第1行导致错误:请求从“C”转换为非标量类型“C”。我知道我可以把它写成第2行,但是我如何才能使用make_class()并将它赋给一个变量呢 #include <iostream> using namespace std; template<class T> class C { T f; public: C(T ff) : f(ff) {} }; template<class Ft> C<Ft> make_class(c

第1行导致
错误:请求从“C”转换为非标量类型“C”
。我知道我可以把它写成第2行,但是我如何才能使用
make_class()
并将它赋给一个变量呢

#include <iostream>

using namespace std;

template<class T> class C {
    T f;
public:
    C(T ff) : f(ff) {}
};  

template<class Ft> C<Ft> make_class(const Ft& f) 
{
    return C<Ft>(f);
}

void f()
{
    cout << "f()" << endl;
}   

int main() 
{
//  C<void(*)()> v = make_class(f);     // line 1
    C<void(*)()> v(f);                  // line 2

    return 0;
}
#包括
使用名称空间std;
模板类别C{
tf;
公众:
C(tff):f(ff){}
};  
模板C制造类(常数Ft&f)
{
返回C(f);
}
void f()
{

cout函数类型和指向函数类型的指针在语言中是不同的类型。虽然在大多数上下文中,前者会退化为后者,但当用作模板参数时,它们会生成两个不相关的类型(模板的不同实例化产生不相关的类型)。 推导出的类型是对函数的常量引用,而不是指向函数的指针。一个简单的解决方法是从函数签名中删除
常量&
,这将强制衰减为指向函数的指针(不能按值传递函数)

关于第二个问题,称为聚合初始化,它实际上是对数组(数组是聚合的子集)执行的相同初始化

template <typename F>
struct foo {
    F f;
    void call() {
        f();
    }
};

void function() {
    std::cout << "function called" << std::endl;
}

int main() {
    foo<void(*)()> a = { function }; // line 3: { } is an array?
    a.call();
}