如何正确使用模板类的静态成员函数初始化该类对象?
问题解决方法
1. 修正静态成员的访问方式
编译器报错的直接原因是:MyClass是模板类而非具体类类型,访问其静态成员时必须明确指定模板特化版本。你需要把MyClass.func1改为MyClass<int>::func1,明确引用int特化版本的静态成员。
正确的对象初始化代码:
MyClass<int> myObj(MyClass<int>::func1);
2. 修复静态成员的类内初始化问题
原代码中静态成员func1和func2的类内直接初始化写法不符合C标准(除非是constexpr成员或使用C17及以后的inline特性),需要根据你的C++版本调整:
方式一:C++17及以后(推荐)
给静态成员添加inline关键字,允许类内直接完成初始化:
template <typename T> class MyClass { public: inline static std::function<T(T, T)> func1 = [](T a, T b) { // 自定义实现逻辑,示例:返回两数之和 return a + b; }; inline static std::function<T(T, T)> func2 = [](T a, T b) { // 自定义实现逻辑,示例:返回两数之积 return a * b; }; MyClass(std::function<T(T, T)> func) { // 构造函数逻辑 } };
方式二:C++17之前
类内仅声明静态成员,在类外完成定义与初始化:
template <typename T> class MyClass { public: static std::function<T(T, T)> func1; static std::function<T(T, T)> func2; MyClass(std::function<T(T, T)> func) { // 构造函数逻辑 } }; // 类外定义并初始化静态成员 template <typename T> std::function<T(T, T)> MyClass<T>::func1 = [](T a, T b) { return a + b; // 示例实现 }; template <typename T> std::function<T(T, T)> MyClass<T>::func2 = [](T a, T b) { return a * b; // 示例实现 };
内容的提问来源于stack exchange,提问作者Wais Kamal
相关产品推荐
相关产品推荐

