首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++链接错误,我理解但不能解决它

C++链接错误,我理解但不能解决它
EN

Stack Overflow用户
提问于 2018-07-27 11:27:06
回答 1查看 67关注 0票数 0

我对C++还是个新手。我试图创建一个包含一些函数和类的库。

在visual studio解决方案中,我创建了另一个控制台项目,包括库,它在最初的几次中工作,但随着我创建更多的源文件,链接器给了我LNK 2019错误的未解决的外部符号。

我已经在我的头文件和类中实现了所有函数,还会出什么问题呢?下面是我的收录内容

TS.h

代码语言:javascript
复制
/* I include "TS.h" in the console project */
#pragma once
#include "TMiscFunc.h"
#include "TFraction.h"

TFraction.h

代码语言:javascript
复制
 #pragma once
    #include <iostream>
    #include "TMiscFunc.h"
    namespace TS {
    //The class which simulates a fraction
    }

TFraction.cpp

代码语言:javascript
复制
#include "TFraction.h"

    //Implementation of the functions of TFraction.h

TMiscFunc.h

代码语言:javascript
复制
namespace TS {


template <typename T0> T0 TAbsolute(T0 value);
template <typename T0> T0 TCeiling(T0 value);
template <typename T0> T0 TFloor(T0 value);
template <typename T0> T0 TPower(T0 value, int power);

TMiscFunc.cpp

代码语言:javascript
复制
#include "TMiscFunc.h"

 template <typename T0> T0 TAbsolute(T0 value) {
    //operations...
}
template <typename T0> T0 TCeiling(T0 value) {
    //operations...
}

template <typename T0> T0 TFloor(T0 value) {
    //operations...
}

template <typename T0> T0 TPower(T0 value, int power) {
    //operations...
}

错误消息:

代码语言:javascript
复制
Error   LNK2019 unresolved external symbol "int __cdecl 
TS::TAbsolute<int>(int)" (??$TAbsolute@H@TS@@YAHH@Z) 
referenced in function "public: void __thiscall 
TS::TFraction::Simplify(void)" (? 
Simplify@TFraction@TS@@QAEXXZ)

除了函数名被更改之外,所有的错误都是相同的

感谢大家的阅读。

//已解决

EN

回答 1

Stack Overflow用户

发布于 2018-07-27 12:09:23

这里是一个最小的、完整的和可验证的示例来演示上述情况。它是基于Linux + gcc的,所以链接错误中的文本有一点不同,但除此之外它是一样的。以下是这些文件:

代码语言:javascript
复制
$ ls
Fraction.cpp  Fraction.h  Fraction_Int.h  main.cpp

以及它们的内容:

代码语言:javascript
复制
$ cat Fraction.cpp
template<typename T0> T0 Floor(T0 value){ return value; }

$ cat Fraction.h
#ifndef __FRACTION_H__
#define __FRACTION_H__    
template<typename T0> T0 Floor(T0 value);    
#endif

$ cat Fraction_Int.h
#ifndef __FRACTION_INT_H__
#define __FRACTION_INT_H__    
class Fraction_Int {
public:
    int nom;
    int denom;
};    
#endif

$ cat main.cpp
#include "Fraction.h"
#include "Fraction_Int.h"
int main(int argc, char **argv)
{
    Fraction_Int fi;
    Floor<Fraction_Int>(fi);
    return 0;
}

当我像这样编译它时,我得到:

代码语言:javascript
复制
$ g++ -o main main.cpp Fraction.cpp
/tmp/cc4fLBk5.o: In function `main':
main.cpp:(.text+0x26): undefined reference to `Fraction_Int Floor<Fraction_Int>(Fraction_Int)'
collect2: error: ld returned 1 exit status

然后我将实现放在h文件中:

代码语言:javascript
复制
$ cat Fraction.h
#ifndef __FRACTION_H__
#define __FRACTION_H__
template<typename T0> T0 Floor(T0 value){ return value; }
#endif

$ cat Fraction.cpp
//template<typename T0> T0 Floor(T0 value){ return value; }

当我编译一切都没问题的时候...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51550342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档