代码之家  ›  专栏  ›  技术社区  ›  Jacobian

参数包和函数声明

c++
  •  0
  • Jacobian  · 技术社区  · 7 年前

    我有三个文件- 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++主。cpp库。cpp公司
    

    我收到以下错误消息:

    主要的cpp:(.text+0x14):未定义对“void funcN(int,int,…)”的引用 collect2:错误:ld返回1退出状态

    我知道这个错误是因为 auto... 我知道,如果我把实现放进去,我可能会解决这个问题 lib。h类 ,但这看起来很糟糕-在一个文件中有一些实现,而在另一个文件中有其他实现。我想知道,他们在现实世界中是如何做到这一点的。

    2 回复  |  直到 7 年前
        1
  •  5
  •   Vittorio Romeo    7 年前

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

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

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

    // lib.h
    template <typename... Js>
    void funcN(int i, Js... js) {
    
    }
    

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

        2
  •  -1
  •   user7860670    7 年前

    在这种情况下 auto... 不使用自动类型声明参数包。它声明了一个后跟常规省略号的未命名参数,因为编译器允许在省略号之前省略逗号。声明没有 auto 如果你想得到一个正则的变量函数

    void funcN(int i, ...)
    

    或者作为头文件中的适当模板,如果您想获得真正的参数包

    template<typename... TArgs> void
    function(int i, TArgs... args) {}