如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
How to properly invoke a function object within a class template's member function? Visual Studio Compiler Error C2440 is being generated
这是在这里找到的这个问题的后续!
现在,我能够实例化对象。我现在收到一个Visual Studio C2440编译器错误...
在模板化之前的原始代码中,我有一组成员函数,用于处理std::function<double(double)>
成员对象,如下所示:
struct SomeStruct {
double a_;
double b_;
SomeStruct(double a, double b) : a_{a}, b_{b} {}
};
class SomeClass {
private:
SomeStruct fields_;
size_t n_;
std::function<double(double)> func_;
public:
SomeClass(SomeStruct fields, size_t n, std::function<double(double)> func) :
fields_{fields}, n_{n}, func_{func}
{}
double evaluate() {
auto distance = fields_.a_ - fields_.b_;
auto dx = distance / n_;
return calculate(dx, fields_);
}
private:
double calculate(double dx, const SomeStruct& someStruct) {
double result = 0;
for (size_t i = 0; i < n_; ++i) {
auto dy = func_(someStruct.a_ + i * dx);
auto area = dy * dx;
result += area;
}
return result;
}
};
现在我的类看起来像这样:
template<typename Field>
struct SomeStruct {
Field a_;
Field b_;
constexpr SomeStruct(Field a, Field b) : a_{a}, b_{b} {}
};
template<typename FieldType, typename ValueType, typename Func>
class SomeClass {
private:
SomeStruct<FieldType> fields_;
size_t n_;
Func func_;
public:
SomeClass(SomeStruct<FieldType> fields, size_t n, Func func) :
fields_{fields}, n_{n}, func_{func}
{}
constexpr ValueType evaluate() {
auto distance = fields_.a_ - fields_.b_;
auto dx = distance / n_;
return calculate(dx, fields_);
}
private:
constexpr ValueType calculate(ValueType dx, const SomeStruct<FieldType>& someStruct) {
ValueType result = 0;
for (size_t i = 0; i < n_; ++i) {
auto dy = func_(someStruct.a_ + i * dx);
auto area = dy * dx;
result += area;
}
return result;
}
};
template<typename FieldType, typename ValueType, typename Func>
SomeClass(SomeStruct<FieldType>, ValueType, Func) ->
SomeClass<FieldType, ValueType, Func>;
我现在尝试这样使用该类:
template<typename T>
constexpr T funcA(T x) {
return x;
}
template<typename T>
constexpr T funcB(T x) {
return x*x;
}
int main() {
SomeClass a{SomeStruct{1.0, 3.0}, 1000, &funcA<double>};
// a.evaluate();
SomeClass b{SomeStruct{3.5, 7.5}, 2000, &funcB<double>};
// b.evaluate();
return 0;
}
我收到这个视觉工作室错误...
1>------ Build started: Project: Computations, Configuration: Debug Win32 ------
1>main.cpp
1>c:users...main.cpp(33): error C2440: 'initializing': cannot convert from 'initializer list' to 'Integrator<double,int,T (__cdecl *)(T)>'
1> with
1> [
1> T=double
1> ]
1>c:users...main.cpp(33): note: No constructor could take the source type, or constructor overload resolution was ambiguous
1>Done building project "Computations.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
这是在我调用其公共evaluate()
函数之前生成的,该函数将调用其 私人calculate()
功能...
我正在尝试解决此编译器错误,并且我正在尝试确保我能够正确调用存储在此类中的函数对象、函数指针、函子、lambda......
问题出在数据成员Func
的声明中:
Func* func_;
它声明func_
是指向演绎指南推导的类型:
template <typename FieldType, typename ValueType, typename Func>
SomeClass(SomeStruct<FieldType>, ValueType, Func)
-> SomeClass<FieldType, ValueType, Func>;
通过使用函数地址调用构造函数:
SomeClass a{SomeStruct{1.0, 3.0}, 1000, &funcA<double>};
Func
推算为:
Func = double(*)(double)
因此,Func*
成为指向函数指针的指针:
Func* = double(**)(double)
并且不能用&funcA<double>
初始化.请改用Func
单独用作数据成员类型。
正在尝试确保我能够正确调用存储在此类中的函数对象、函数指针、函子、lambda
要么为此使用概念,要么使用静态断言:
static_assert(std::is_invocable_v<Func&, FieldType&>, "Invalid callable");
相关文章:
- Visual Studio中的函数声明和函数定义问题
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 带有自动参数的函数使用 GCC 编译,但不使用 Visual C++ 编译
- Visual Studio 中的 sqrtf 函数替代
- 我可以在Visual Studio 2019上的项目下使用多个主函数吗?
- Visual Studio 无法解决类和命名空间中重载的明确函数
- 如何使用Visual Studio 2008将字符串映射到函数?
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配
- 从 DLL 导出 ASM 函数 - Visual Studio C++
- 默认移动构造函数 Visual Studio 2015
- 定义类编译错误的函数(Visual Studio)
- 调试构建中的内联函数(Visual C++2008)
- RValue,模板解析和复制构造函数(Visual c++ 2010)
- c++中未解析的外部函数:Visual c++对方法签名的修改与dll中修改的方法不同