【问题标题】:Implementing variadic method in C++ issue [duplicate]在 C++ 问题中实现可变参数方法 [重复]
【发布时间】:2014-10-30 15:14:27
【问题描述】:

我正在尝试实现一个可变参数方法,但是当我尝试以下代码时它无法编译:

配置.h

#ifndef Test_Configurations_h
#define Test_Configurations_h

#include <vector>

class Configuration
{
public:
    Configuration(){}
    int someData;
};


class Configurations
{
public:
    void addConfiguration (Configuration config);

    template<typename... Args>
    void addConfiguration (Configuration first, Args... args);

private:
    std::vector<Configuration> _configs;

};

#endif

配置.cpp

#include "Configurations.h"

void Configurations::addConfiguration (Configuration config)
{
    // do something
}

template<typename... Args>
void Configurations::addConfiguration (Configuration first, Args... args)
{
    // Do something
}

main.cpp

#include <iostream>
#include "Configurations.h"


int main(int argc, const char * argv[]) {

    Configuration c1;
    Configuration c2;

    Configurations configurations;

    configurations.addConfiguration(c1, c2);

    return 0;
}

当我尝试调用该方法时

addConfiguration (config1, config2)

编译器给我以下错误:

Undefined symbols for architecture x86_64:
  "void Configurations::addConfiguration<Configuration>(Configuration, Configuration)", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我认为我没有正确声明方法,但我不知道错误在哪里。

提前致谢!

【问题讨论】:

  • 你有一个链接错误,你是否在cpp中实现了可变参数addConfiguration并在其他翻译单元中使用它?
  • 不,关键是如果我使用一个简单的例子,它就可以工作,但是当我想添加我自己的类时,我会遇到这个错误
  • 我认为模板函数的主体应该是addConfiguration(first); addConfiguration(args); 否则它只会添加最后传递的配置,而忽略所有其他配置。
  • 我猜“简单示例”不是模板,并且实现是在源文件中,而不是在标题中。模板通常必须在标头中实现,因为定义必须在需要实例化它的每个翻译单元中都可用。
  • 为我工作。 ideone.com/fyUabd

标签: c++ variadic


【解决方案1】:

问题正如 Mike 所说:您在标头中声明函数模板,但在源文件中定义它。声明和实现都需要留在同一个翻译单元中。我已经以更全面的答案作为重复问题结束了这个问题。

【讨论】:

    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 2010-10-12
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多