C ++中多重定义的解决方案

用户名

伙计们,这是我在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 ++以来,我一直无法解决这个问题。因此,请提出任何建议!提前致谢!

迪特玛·库尔(DietmarKühl)

的专业化getvalue<std::string>(...)不是模板,因此不是隐式的inline如果要在标头中定义此函数,例如,因为它接近琐碎且应为inlined,则需要将其显式标记为inline如果函数做了一些重要的事情,那么仅在标头中声明专门化并在合适的转换单元中进行定义就值得。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++中多重定义的解决方案

来自分类Dev

C ++中的多个定义错误以及解决此问题的解决方案

来自分类Dev

了解 c 中的背包解决方案

来自分类Dev

在MonoDevelop中启动C#解决方案和项目

来自分类Dev

大型C#解决方案中的配置文件

来自分类Dev

解决方案文件中的C#项目名称

来自分类Dev

大型C#解决方案中的配置文件

来自分类Dev

比C ++中的dynamic_cast更好的解决方案

来自分类Dev

如何在C ++中设置多项目解决方案?

来自分类Dev

C#逻辑(编码中需要的解决方案)

来自分类Dev

解决方案资源管理器中的C#多个自定义app.config文件

来自分类Dev

c ++ 11是否提供与python maketrans / translate中实现的解决方案类似的解决方案?

来自分类Dev

交替for循环的c ++通用解决方案

来自分类Dev

C ++弱函子解决方案

来自分类Dev

限制 C# 功能的解决方案

来自分类Dev

C# FizzBuzz 开关解决方案

来自分类Dev

针对C#解决方案的MSBuild(类似版本)上的自定义

来自分类Dev

针对C#解决方案的MSBuild(类似版本)上的自定义

来自分类Dev

LINQ多重解决方案

来自分类Dev

C ++ / C#解决方案中不可用的任何CPU

来自分类Dev

C 裸函数 - 在 1 个函数中执行汇编和 c 代码的灼热解决方案

来自分类Dev

如何在C#解决方案中引用其他文件夹中的文件

来自分类Dev

如何在C#解决方案中引用其他文件夹中的文件

来自分类Dev

Xcode为c ++中的显式死代码提供了奇怪的解决方案?

来自分类Dev

如何使用roslyn删除c#解决方案中源代码的所有注释?

来自分类Dev

使解决方案中的每个csproj都针对不同的C#版本

来自分类Dev

通过C#解决方案中的规则进行崩溃编译的扩展

来自分类Dev

VB解决方案中的C#类库不会导入

来自分类Dev

解决方案中存在C ++ Universal App时NuGet还原.vcxitems错误

Related 相关文章

  1. 1

    C ++中多重定义的解决方案

  2. 2

    C ++中的多个定义错误以及解决此问题的解决方案

  3. 3

    了解 c 中的背包解决方案

  4. 4

    在MonoDevelop中启动C#解决方案和项目

  5. 5

    大型C#解决方案中的配置文件

  6. 6

    解决方案文件中的C#项目名称

  7. 7

    大型C#解决方案中的配置文件

  8. 8

    比C ++中的dynamic_cast更好的解决方案

  9. 9

    如何在C ++中设置多项目解决方案?

  10. 10

    C#逻辑(编码中需要的解决方案)

  11. 11

    解决方案资源管理器中的C#多个自定义app.config文件

  12. 12

    c ++ 11是否提供与python maketrans / translate中实现的解决方案类似的解决方案?

  13. 13

    交替for循环的c ++通用解决方案

  14. 14

    C ++弱函子解决方案

  15. 15

    限制 C# 功能的解决方案

  16. 16

    C# FizzBuzz 开关解决方案

  17. 17

    针对C#解决方案的MSBuild(类似版本)上的自定义

  18. 18

    针对C#解决方案的MSBuild(类似版本)上的自定义

  19. 19

    LINQ多重解决方案

  20. 20

    C ++ / C#解决方案中不可用的任何CPU

  21. 21

    C 裸函数 - 在 1 个函数中执行汇编和 c 代码的灼热解决方案

  22. 22

    如何在C#解决方案中引用其他文件夹中的文件

  23. 23

    如何在C#解决方案中引用其他文件夹中的文件

  24. 24

    Xcode为c ++中的显式死代码提供了奇怪的解决方案?

  25. 25

    如何使用roslyn删除c#解决方案中源代码的所有注释?

  26. 26

    使解决方案中的每个csproj都针对不同的C#版本

  27. 27

    通过C#解决方案中的规则进行崩溃编译的扩展

  28. 28

    VB解决方案中的C#类库不会导入

  29. 29

    解决方案中存在C ++ Universal App时NuGet还原.vcxitems错误

热门标签

归档