C++ 可变参数模板"multiple definitions"/"already defined"问题
C++ Variadic Template "multiple definitions"/"already defined" Issue
最近发现了模板,我一直在努力掌握它们,并发现了我真正想实现的模板用法;但我尝试了很多东西,却总是出错。
我正在尝试创建一个函数,它可以以任何顺序同时接受多种类型的参数。
(我使用的是VS 2013。)
我现在有一个"已定义"错误(仅当在多个文件中包含tem.h
时):
准确的第一个错误(其余的基本相同,只是每次测试…过载?):
Error 1 error LNK2005: "void __cdecl test<struct A>(struct A *)" (??$test@UA@@$$$V@@YAXPAUA@@@Z) already defined in main.obj c:UsersUserdocumentsvisual studio 2013ProjectsTemplateTestTemplateTestfoo.obj TemplateTest
foo只是一个.cpp文件,只包含:#include "tem.h"
tem.h
:
#ifndef TEM_H
#define TEM_H
struct A {};
struct B {};
#include <iostream>
template<typename First, typename... Rest>
void test(First *t, Rest&&... args){
test(t);
test(std::forward<Rest>(args)...);
}
template<>
void test<A>(A *val){
std::cout << "Handled A" << std::endl;
}
template<>
void test<B>(B *val){
std::cout << "Handled B" << std::endl;
}
#endif
main.cpp
:
#include <iostream>
#include "tem.h"
int main(int argc, char *argv[]){
std::cout << "running test..." << std::endl;
A a;
B b;
test(&a, &b);
return 0;
}
导致此错误的原因是我缺少什么?
编辑:使每个测试实例内联可以防止错误,但我不认为这是最好的解决方案
函数模板专业化本身并不是模板,它们是具有奇特语法的普通函数。与任何其他正常函数一样,除非使用inline
关键字,否则不应在头文件中定义它们。
要么将inline
添加到这两个专门化中,要么只在头中保留它们的声明,并将定义移动到某个.cpp文件中。
主模板定义是可以的,应该原封不动地保留在标题中。
不过,一般建议是避免函数模板专业化。您可以使用正常的非模板重载:
void test (A*);
void test (B*);
相关文章:
- C++ 链接到单独的.cpp文件说"multiple definitions"
- 使用"std::enable_if_t" "function template has already been defined"
- 如果两个静态库使用相同的另一个静态库,如何避免"LNK2005 Already Defined error"?
- 使用 gtest 时"_main already defined"
- 为什么只有一个库的链接器错误'multiple definitions'?在 Android Studio 中使用 CMake (3.4.1)
- "... already defined in *.obj"但我没有在同一范围内两次定义任何变量
- Linux MinGW:在编译时,他输出了 8 个"nultiple definitions"列表
- 为什么会出现"Multiple Definitions"错误
- "Function template has already been defined"与相互排斥的"enable_if"一起
- C++提升async_accept异常"already open"
- 是什么导致了代码中出现"error LNK2005: already defined in .obj"错误?
- 在VS 2015中使用Microchip的mpusbapi.h会产生"LNK2005 Already defined"错误
- "Destructor already defined"专用析构函数
- 由 Boost 单元测试框架 dll 导出的 std::basic_ostringstream 会导致"already defined symbol"错误
- 如何解释C++标准文档中的"terms and definitions"?
- VS 链接器失败,标准::字符串方法出现"object already exists"错误
- 在 Asio 中建立新连接时出现"Already Open"错误
- 为什么"already defined"?
- CreateFileMapping() 即使在重新启动后也会返回"already exists";如何删除旧的命名共享内存?
- C++ 可变参数模板"multiple definitions"/"already defined"问题