参数包和函数声明

我有三个文件 - lib.h函数声明lib.cpp带有实现和main.cpp入口点。其内容是一样简单:参数包和函数声明

//lib.h 

#pragma once

void func1();

void func2();

void funcN();

//lib.cpp

#include "lib.h"

void func1(){}

void func2(){}

void funcN(){}

//main.cpp

#include "lib.h"

int main() {

return 0;

}

我编译它,像这样:

$ g++ main.cpp lib.cpp 

到目前为止,一切都很好。但是现在我想在我的一个函数中使用参数包。像这样:

//change in lib.cpp 

void funcN(int i, auto... j) {

}

我改变分别lib.h和main.cpp中:

//change in lib.h 

void funcN(int, auto...);

//change in main.cpp

int main() {

funcN(1, 2);

return 0;

}

但是现在,当我与

$ g++ main.cpp lib.cpp 

编译它,我得到这个错误信息:

main.cpp:(.text+0x14): undefined reference to `void funcN(int, int, ...)' collect2: error: ld returned 1 exit status

我知道这个错误是因为auto...,我知道我可以解决它,如果我在lib.h内部实现,但这看起来很讨厌 - 在一个文件中实现一些实现,在另一个文件中实现其他实现。我想知道,他们如何在现实世界的实践中做到这一点。

回答:

使用auto作为函数参数不是标准C++。您的代码目前无效C++。有关更多信息,请参见Is auto as a parameter in a regular function a GCC 4.9 extension?。请注意,auto作为函数参数(以及简写概念语法)尚未添加到C++ 20的工作草案中。

无论如何,以这种方式使用auto只是函数模板定义的简写 - 这意味着您需要定义您的函数在标头中。

这里有一个解决方案是有效的C++:

// lib.h 

template <typename... Js>

void funcN(int i, Js... js) {

}

的更多信息:Why can templates only be implemented in the header file?

回答:

在这种情况下,auto...不会声明带自动类型的参数包。它声明一个未命名的参数,然后是常规省略号,因为编译器允许在elipses之前省略逗号。声明它没有auto如果你想获得一个常规的可变参数函数

void funcN(int i, ...) 

或在头文件合适的模板,如果你想获得真正的参数包

template<typename... TArgs> void 

function(int i, TArgs... args) {}

以上是 参数包和函数声明 的全部内容, 来源链接: utcz.com/qa/261798.html

回到顶部