首页 > 解决方案 > 使用本地类型声明的 g++ lambda ... 已使用但从未定义 - 真的是错误吗?

问题描述

g++ 不会在没有-fpermssive. clang 和 icc 都没有抱怨。这段代码合法吗?

我的意图是在一个编译单元中声明wrapped_foo并在一个单独的编译单元中定义它。那可能吗?

错误1.cpp

auto wrap(int (*f)(int)){
    return [f](int i) {
        return f(i);
    };
}

int foo(int);
extern decltype(wrap(foo)) wrapped_foo;

int func(){
    return wrapped_foo(2);
}
花园与 -m gcc/7.3.0-01c7/bin g++ -Wall -Wextra bug1.cpp -c
bug1.cpp:8:28: 错误:'wrap(int (*)(int))::<lambda(int)> Wrapped_foo',使用本地类型'wrap(int (*)(int))::< lambda(int)>', 被使用但从未定义 [-fpermissive]
 extern decltype(wrap(foo)) Wrapped_foo;
                            ^~~~~~~~~~~

标签: c++lambdag++

解决方案


对的,这是可能的:

头文件

inline auto wrap(int (*f)(int))
{
    return [f](int i) {
        return f(i);
    };
}

int foo(int i);
extern decltype(wrap(&foo)) wrapped_foo;

.cpp 文件

int foo(int i) { return i;}
decltype(wrap(foo)) wrapped_foo = wrap(&foo);

用法

int func(){
    return wrapped_foo(42);
}

int main() {
    std::cout << func() << std::endl;
}

演示


推荐阅读