VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1487|回复: 10

关于一个include的弱智问题

[复制链接]

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-21 09:20:02 | 显示全部楼层 |阅读模式
我不是计算机专业的学生,最近在用C++,被一个弱智的include问题弄晕了,请高手指点一二:

程序有3个文件,main.cpp, a.h, a.cpp

main函数在 main.cpp里面
a.h 是类a的头文件,声明了一些接口
a.cpp是类a的实现文件

代码如下:
////////////////////////////////////main.cpp
#ifndef MAIN_CPP
#define MAIN_CPP

#include <iostream.h>
#include "a.h"

int main( )
{
  a<int> d;
  d.setdata(3);
  cout << d.getdata()<<endl;
  return 0;
}

#endif

#ifndef A_H
#define A_H


//////////////////////////////////////a.h
template<class type>
class a
{
public:
        type data;

        a() {}
        ~a() {}

        void setdata(type value);
        type getdata();
};

#endif

////////////////////////////////////////////a.cpp
#ifndef A_CPP
#define A_CPP


#include "a.h"

template<class type>
void a<type>::setdata(type value)
{
        a<type>::data = value;
}

template<class type>
type a<type>::getdata()
{
        return a<type>::data;
}

#endif


现在的问题是:
该段代码编译时可通过,但链接过程出问题了,VC6给出下列错误
Compiling...
main.cpp
Linking...
main.obj : error LNK2001: unresolved external symbol "public: void __thiscall a<int>::setdata(int)" (?setdata@?$a@H@@QAEXH@Z)
Debug/main.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

main.exe - 2 error(s), 0 warning(s)


然后我把a.cpp中的代码copy到a.h中,即a.h实现了类a的声明和定义,同时删除a.cpp,程序就没有任何问题了!

why????????
回复

使用道具 举报

1

主题

10

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-1-31 09:54:02 | 显示全部楼层
好象有点废话  你include"a.h" 连接的程序就到a.h 去找class a了
include 包含的是extern的类 即外部的   当然错了
直接class a 就不用include了
回复

使用道具 举报

0

主题

57

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-2-1 21:27:01 | 显示全部楼层
你不需要再模板函数上这么写
template<class type>
type a::getdata()

直接像上面这样就可以了

PS:Cpp文件基本不用担心被重复引用...
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-2-3 18:15:01 | 显示全部楼层
谢谢楼上二位的建议。
TO:fangtao826
“直接class a 就不用include了”怎么理解?是说在main.cpp里直接定义class a 么?
现在我的问题是:为什么使用了a.cpp会产生链接错误?我该怎么更改呢?

To:food0012
不需要么,我自己试了一下,采用
template<class type>
type a::getdata()
产生了编译错误:
Compiling...
a.cpp
C:\Documents and Settings\JINGLELONG\Desktop\test\a.cpp(13) : error C2955: 'a' : use of class template requires template argument list
        c:\documents and settings\jinglelong\desktop\test\a.h(15) : see declaration of 'a'
Error executing cl.exe.

main.exe - 1 error(s), 0 warning(s)
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-2-3 20:15:01 | 显示全部楼层
我觉得这个include 错误和函数模板是没有关系的,肯定是那个地方的include用错了。
回复

使用道具 举报

0

主题

24

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-2-17 10:30:01 | 显示全部楼层
目前很少有编译器支持分离模式编译

a.h a.cpp 内容合并放到一个文件
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-3-23 01:45:01 | 显示全部楼层
谢谢!
我的编译器是VC6,

做控制台程序的时候是无法分开编译,但是MFC中是可以的。
回复

使用道具 举报

0

主题

15

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-3-24 21:00:01 | 显示全部楼层
class a是模板,它的声名与定义要写在一起
回复

使用道具 举报

0

主题

9

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-3 20:15:01 | 显示全部楼层
#ifndef xxx
#define xxx
......
#endif

这个结构是放在.h文件里的(而且是相当有必要的),cpp文件没有必要放这个。
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-7-4 17:15:02 | 显示全部楼层
这是模板类的问题,将模板的定义与实现放在.h文件当中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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