gpt4 book ai didi

C++ 可变参数模板 "multiple definitions"/"already defined"问题

转载 作者:行者123 更新时间:2023-11-28 00:23:05 25 4
gpt4 key购买 nike

<分区>

最近发现了模板,我一直在努力很好地掌握它们,并发现了我真正想实现的用法;但尝试了多种方法后,我不断出错。

我正在尝试创建一个函数,该函数可以以任何顺序一次接受多种类型的参数。

(我使用的是 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:\Users\User\documents\visual studio 2013\Projects\TemplateTest\TemplateTest\foo.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;
}

我错过了什么导致了这个错误?

编辑:使每个测试实例内联可以防止错误,但我认为这不是最好的解决方案

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com