gpt4 book ai didi

C++ 语法 : error conversion from some_type to non-scalar_type requested

转载 作者:行者123 更新时间:2023-11-28 07:09:27 24 4
gpt4 key购买 nike

第 1 行导致 error: conversion from ‘C<void()>’ to non-scalar type ‘C<void (*)()>’ requested .我知道我可以把它写成第 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;
}

另一个问题来自这个link .代码如下所示。如何理解第3行?

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();
}

谢谢。

最佳答案

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

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

关于C++ 语法 : error conversion from some_type to non-scalar_type requested,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21245707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com