在使用类模板的情况下,如果像不实用类模板那样文件分离,那么在类(.h)中声明的函数和在文件(.cpp)中的关联不上(因为也是新手嘛,术语不对不要见怪哈),会出现“无法解析外部符号……………………………………”的error,而直接在类的定义中(.h)中写好的函数就不会出现这种错误,折腾了一个多小时之后终于发现,其实解决办法很简单哈,但是头次见到这样写的,很奇葩啊。对,解决方法就是在你使用哪个类的函数的文件中(main.cpp也好,或是其他你写的测试文件中也好)加入这么一行” #include”test.cpp” ”(这个test.cpp是test类的.h文件对应的那个哈,可能说不明白,动动大脑袋吧),include的是.cpp文件,反正之前我是一直没见过,可能是俺太新手了吧哈。
下面附上一小段测试代码哈
//stdafx.h 这个是建立项目时候,选择“预编译头(不是空项目那个)”之后自己蹦跶出来的,都是往里写你需要的头文件的。
#pragma once
#include "targetver.h"
//上面那行也是自己蹦跶出来的,我也不知道具体干嘛的
#include <stdio.h>
#include <tchar.h>
//这两行的话,学过C语言的一般都知道
//targetver.h 同上
#pragma once
// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。
// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。
#include <SDKDDKVer.h>//没办法水平太差,这我也不认识
//test.h // 这就是自己写的类的定义了
#pragma once
#include <iostream>
using namespace std;
template<class T>
class test
{
public:
void Show1(){cout<<"类内"<<endl;}//对比一下,这个函数写在类内
void Show2();//这个卸载类外,也就是test.cpp里
test(void);
~test(void);
};
//test.cpp //类的实现
#include "stdafx.h"
#include "test.h"
template<class T>
test<T>::test(void)
{
}
template<class T>
test<T>::~test(void)
{
}
template<class T>
void test<T>::Show2()
{
cout<<"类外"<<endl;
}
// stdafx.cpp
#include "stdafx.h"
#include <iostream>
using namespace std;
//Exercise.cpp //最后一个文件喽
// Exercise.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "test.h"
#include "test.cpp" //最关键的地方了,这就是上面说的include 一个 .cpp文件
int _tmain(int argc, _TCHAR* argv[])
{
test<int > t;
t.Show1();
t.Show2();
return 0;
}
补充一下,这么写完之后吧,如果你修改了test.cpp的内容,再直接运行,还是你修改之前的结果(为啥我也不知道,也可能是我编译器问题),如果这样的话呢,就把”//#include<test.cpp>”的注释去掉,然后运行一下,这样肯定是错的,不要紧,只是让他编译一下(可能有说错术语了哈),然后再把//加上,再运行,你会发现就是你修改之后的结果了。
最后哈,俺觉得,文件分离如果是初学者的话现不用也就不用吧,类模板也是,不太会用就不要用了,要不我们这上机作业都不好搞定了,应该没几个人跟我一样才学C++没多长时间就开始没事喜欢折腾这些东西吧哈?
对了,最后的最后,如果不慎被哪个高手看到了哈,您就忍一忍吧,手下留情。。。。。。