【发布时间】: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