C++ c++;语法:请求从某些\u类型转换为非标量\u类型时出错
第1行导致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
错误:请求从“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();
}