能否在C++类内将具名Lambda作为成员并在main中调用?报错求解
在C++类中使用具名Lambda作为成员并调用的正确方式
你遇到的错误完全是因为语法写法不对——auto showbits() =[](){...};这种写法被编译器误判成了试图声明纯虚函数,但纯虚函数只能用=0来初始化,自然会抛出错误。下面给你两种可行的解决方案,你可以根据需求选择:
方案1:静态Lambda成员(无需访问类实例成员)
如果你的Lambda不需要访问类里的n这类实例变量,可以把Lambda声明为类的静态成员。注意C17及以上版本支持在类内直接初始化静态auto成员,C11/14则需要在类外补充定义:
#include <iostream> using namespace std; class convert { public : int n; convert(int number) : n(number) {} // 用初始化列表初始化成员更规范 // C++17及以上可直接在类内初始化静态Lambda static auto showbits = [](){ cout<<"showbits called "<<endl; }; }; // 若使用C++11/14,必须在类外添加这行定义: // auto convert::showbits = [](){ cout<<"showbits called "<<endl; }; int main() { convert c(10); c.showbits(); // 调用静态Lambda成员,也可以用convert::showbits() return 0; }
方案2:非静态Lambda成员(需要访问类实例成员)
如果你的Lambda需要访问类的实例变量(比如n),就得把Lambda作为非静态成员变量,用std::function声明类型,然后在构造函数里初始化并捕获this:
#include <iostream> #include <functional> using namespace std; class convert { public : int n; // 声明成员变量为std::function类型,匹配Lambda的签名(无参数无返回值) function<void()> showbits; convert(int number) : n(number) { // 初始化Lambda,捕获this以访问类的实例成员n showbits = [this](){ cout<<"showbits called, n is "<<n<<endl; }; } }; int main() { convert c(10); c.showbits(); // 调用非静态Lambda成员 return 0; }
额外补充:如果你只是想用Lambda来实现成员函数的逻辑,其实不需要把Lambda作为成员变量,直接在成员函数里写Lambda并执行即可,比如:
#include <iostream> using namespace std; class convert { public : int n; convert(int number) : n(number) {} // 成员函数内用Lambda实现逻辑 auto showbits() { [](){ cout<<"showbits called "<<endl; }(); } }; int main() { convert c(10); c.showbits(); return 0; }
内容的提问来源于stack exchange,提问作者mariappan
相关产品推荐
相关产品推荐

