伙计们,这是我在StackOverflow中的第一个问题,如果有任何错误,请原谅我。
我正在写一个包含2个源文件和3个头文件的小项目。
// some_template_functions.h
#ifndef SOME_TEMPLATE_FUNCTION_H
#define SOME_TEMPLATE_FUNCTION_H
template <typename T>
int getvalue(string line, string key, T & val)
{
// method to get value (all the types except string) from line using key
}
template <>
int getvalue<string>(string line, string key, string &val)
{
// method to get some string from line using key, similar to getvale<int>
// but with slight difference to handle some special characters
}
#endif
//myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include "some_template_functions.h"
class MYCLASS
{
//declarations of constructors, member functions and members
double member_double;
string member_string;
}
#endif
//myclass.cpp
#include "myclass.h"
MYCLASS:MYCLASS()
{
// for each member
// using "getvalue" defined in "SOME_TEMPLATE_FUNCTION.H" to get the values
getvalue(line, key, member_double);
getvalue(line, key, member_string);
}
//main.cpp
#include "myclass.h"
#include "some_template_functions.h"
int main()
{
myclass A;
int some_value;
getvalue(line, key, value);
return 0;
}
我编译main.o和myclass.o没问题,但这只是当我尝试链接两个目标文件时,出现如下错误消息:
myclass.cpp: multiple definition of int getvalue<std::basic_string><char, std::char_traits<char>, ...> and etc.
/tmp/cc22zEow.o:main.cpp: first defined here
collect2: ld returned 1 exit status
我知道原因可能是因为我在myclass.h和main.cpp中都包含了“ some_template_function.h”,每个myclass.o和main.o都有自己的getvalue定义,这会引起问题。如果我改变
#include "some_template_functions.h"
至
#ifndef SOME_TEMPLATE_FUNCTIONS_H
#define SOME_TEMPLATE_FUNCTIONS_H
#endif
MYCLASS的构造函数无法正常工作。
我计划将来扩展“ some_template_functions.h”及其.cpp文件,因此,如果可能的话,我希望将它们与其他文件分开。而且因为我声明函数“ getvalue”的方式对将其定义移动到.cpp文件的尝试对我来说不是很好。
我已经尝试了好几天来解决这个问题,但是自从我现在才开始学习C ++以来,我一直无法解决这个问题。因此,请提出任何建议!提前致谢!
的专业化getvalue<std::string>(...)
不是模板,因此不是隐式的inline
。如果要在标头中定义此函数,例如,因为它接近琐碎且应为inline
d,则需要将其显式标记为inline
。如果函数做了一些重要的事情,那么仅在标头中声明专门化并在合适的转换单元中进行定义就值得。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句