吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1107|回复: 9
收起左侧

[已解决] 类模板分文件编写为什么会报错?

[复制链接]
Pammer 发表于 2020-4-26 21:45
本帖最后由 Pammer 于 2020-4-27 09:43 编辑

我知道会报错,只要在头文件里实现就行,但是这是为什么会这样?没有类模板是却可以正常使用。
main.cpp
[C++] 纯文本查看 复制代码
#include"test.h"

int main()
{
        Test<int> a;
        return 0;
}

test.h
[C++] 纯文本查看 复制代码
#pragma once
template<typename T = int>
class Test
{
public:
        Test(T Value = 10);
        T m_Value;
};

test.cpp
[C++] 纯文本查看 复制代码
#include"test.h"

template<typename T>Test<T>::Test(T Arg) :m_Value(Arg) {}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
庸人误我 + 1 + 1 没事,互相帮助嘛!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

庸人误我 发表于 2020-4-26 22:37
.h中的模板是比较特殊的,他不会自动使用.cpp中的函数定义。如果你只引入一个模板的.h,模板会在函数调用(编译阶段)的时候进行展开,而不是去自动链接到.cpp的模板成员函数。就会在链接阶段,产生找不到模板的成员函数的问题。
这是个人理解,不对的话多多包含

免费评分

参与人数 1热心值 +1 收起 理由
Pammer + 1 谢谢@Thanks!

查看全部评分

我的爱是你 发表于 2020-4-26 22:54
本帖最后由 我的爱是你 于 2020-4-26 23:02 编辑

解决方法直接把 #include"test.cpp" 和#include"test.h" 一起包含进去就可以。
至于为啥你编译前不报错是因为编译器检索到了你 test.cpp 文件,但运行 链接时就不一样了无法找到符号链接。
 楼主| Pammer 发表于 2020-4-27 09:43
庸人误我 发表于 2020-4-26 22:37
.h中的模板是比较特殊的,他不会自动使用.cpp中的函数定义。如果你只引入一个模板的.h,模板会在函数调用( ...

感谢讲解
 楼主| Pammer 发表于 2020-4-27 10:34
我的爱是你 发表于 2020-4-26 22:54
解决方法直接把 #include"test.cpp" 和#include"test.h" 一起包含进去就可以。
至于为啥你编译前不报错是 ...

捕获.PNG
再问个问题,这个为什么会报错,但是编译却能正常通过?
我的爱是你 发表于 2020-4-27 11:10
Pammer 发表于 2020-4-27 10:34
再问个问题,这个为什么会报错,但是编译却能正常通过?

没有错误
批注 2020-04-27 110802.jpg
main
批注 2020-04-27 110820.jpg

免费评分

参与人数 1吾爱币 +1 收起 理由
Pammer + 1 谢谢@Thanks!

查看全部评分

 楼主| Pammer 发表于 2020-4-27 14:16

感谢耐心讲解
最后,再问大佬一个问题,可以吗?
[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;

class Test;

int main()
{
	Test a(1);
	return 0;
}

class Test
{
public:
	Test(int Arg)
	{
		cout << Arg << endl;
	}
};

这个为什么会说“使用了未定义类型“Test””
我的爱是你 发表于 2020-4-27 15:40
本帖最后由 我的爱是你 于 2020-4-27 15:45 编辑
Pammer 发表于 2020-4-27 14:16
感谢耐心讲解
最后,再问大佬一个问题,可以吗?
[mw_shl_code=cpp,true]#include

。。。。。。。。。。预留
我的爱是你 发表于 2020-4-27 15:46
本帖最后由 我的爱是你 于 2020-4-27 15:51 编辑

class Test; 仅声明有这个东西 但编译器并不知晓分配多少内存 所以在 class Test 定义前无法调用


程序从上向下指向 由于main 函数优先执行,所以
无法执行到类定义 class test{ }; 无法分配内存 你就要使用 自然报错

解决方法 class Test{ } 定义必须要优先与 要使用此类的函数
#include <iostream>
using namespace std;
class Test;   //声明
class Test {   //定义   此时优先于main
public:
Test(int Arg) {
  cout << Arg << endl;
}
};
int main()
{
/*Test* a1; 如函数优先于定义 则编译器只可使用为 指针*/
  Test a2(10);
return 0;
}

或者
#include <iostream>
using namespace std;
class Test {   //定义
public:
Test(int Arg);  //声明方法
};
int main()
{
  Test a2(10);
return 0;
}
Test::Test(int Arg) {    //命名空间类外实现方法
cout << Arg << endl;
}

我的爱是你 发表于 2020-4-27 15:55
如我在定义一个 void OBJ ( )  函数,函数内调用Test 类创建对象 ;则 在void OBJ 调用前Test 类必须要定义 不能仅声明。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-3 19:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表