g++ 链接器在使用 auto 数据类型时失败

g++ Linker fails when using auto datatype

提问人:SillyGoose 提问时间:7/1/2022 最后编辑:SillyGoose 更新时间:7/1/2022 访问量:94

问:

我最近创建了一个项目,它有一个服务可以通过类订阅。你传递一个无符号的长整型、一个函数指针和你的参数。参数应该能够变化,所以我通过 auto 数据类型实现了它。

class TimerService {
public:
    TimerService();
    ~TimerService();

    void handler();

    void subscribe(uint32_t cycTm, void (*cbFunc) ());
    void subscribe(uint32_t cycTm, void (*cbFnc) (auto*), auto* arg1);
    void subscribe(uint32_t cycTm, void (*cbFnc) (auto*, auto*), auto* arg1, auto* arg2);

private:
    std::vector<TimerSubscriber*> subscribers;
};

然后,在代码中的其他位置,我使用此类。

void Test(int* i, int* j) {
    cout << *i " " << *j << endl;
}

timerService = new TimerService();

int var1 = 1;
int var2 = 2;

timerService->subscribe(5000, Test, &var1, &var2);

对象的编译没有任何问题,但是在链接对象时,链接器失败,并显示“undefined reference to void TimerService::subscribe<int, int, int, int>(unsigned long, void ()(int, int*), int*, int*)”。 然后我所做的是更改我的“订阅”函数,使其采用 int 而不是 auto。更改后,它链接没有问题。链接器怎么可能不能与 auto 数据类型相处?此外,不带任何参数的“订阅”函数可以正常工作。

我正在使用 g++14 使用“-fconcepts-ts”标志进行编译,以启用“auto”数据类型。

C G++ 链接器错误 自动

评论

1赞 kiner_shah 7/1/2022
您使用的是哪个编译器版本?以下代码在 GCC 12.1 中给出编译错误 godbolt.org/z/888n6e7a1
1赞 SillyGoose 7/1/2022
我正在使用 GCC 10.3.1
1赞 SillyGoose 7/1/2022
当我使用您的链接并将编译器版本调整为 GCC 10.3 时,我实际上也遇到了确切的错误。
1赞 Scheff's Cat 7/1/2022
在函数声明中使用(用于参数),使其成为泛型函数。在这种情况下,我敢打赌,如果该函数应该是公共的(如模板),则必须在标头中实现该函数。仅供参考:在 Web 中找到的解释:自动参数生成模板auto
0赞 SillyGoose 7/1/2022
那么问题就变成了我该如何解决它。不幸的是,参数的数据类型各不相同,这也是我选择自动类型的原因。我考虑的一件事是使用 std::function 并通过 std::bind 绑定参数并将结果传递给订阅函数

答: 暂无答案