c++ 变量的重复定义问题 [multiple definition of] 与模板类

    这两天开始慢慢复习c++基础知识和数据结构的内容了。由于立刻各类实习生招聘就开始啦。吼吼。node

    之前在学c++的时候,没太仔细学模板类,用的时候也不多。我想复习的时候,好好看看。结果,在用模板类实现链表的时候,出问题了。ios

问题1.编译出错c++

    老规矩,四个文件 node.h,node.cpp, list.h, list.cpp。结果在编译的时候(见makefile文件),老是出问题。查了一下,缘由是模板类不能分离编译。因而,只能把类定义和类实现放在同一个文件里。数据结构

问题2.全局变量spa

    问题1中,把内容放在同一个文件中,能够了。可是,若是须要在该文件定义了全局变量,怎么办啊?编译器

    问题1中,我吧内容都放在了node.cpp 和list.cpp中,由于没有全局变量,因此,include cpp文件不会出神马问题,编译运行都经过。可是,如今若是定义了全局变量,再include cpp文件的话,就会出现屡次定义的问题。io

    若是把node.cpp和node.h中的内容都写到node.h中,又会致使编译不太办。由于编译是基于.cpp的嘛。编译

    解决办法:模板

    1.把 node.cpp中的全局变量声明成static,这是由于static仅在本文件中生效。所以,若是屡次include,会屡次定义相同的变量,但每一个变量的生存范围仍是本身的文件。这个方法仅适用于 该变量是常量只读的状况。class

    2.写一个global.h 文件。把刚才的node.cpp中的问题所有放到这里。只不过,在global.h中,对全局变量仅仅是声明,即须要在每一个变量前加extern,而后写一个global.cpp文件,对每一个变量进行定义。而后在其余的cpp中 include“global.h文件就行了。问题解决。

    基础知识之前就不怎么熟悉,慢慢练习,加深理解。加油。


刚才问了一个同窗,说.cpp和.h能够分离编译,显示实例化模板。方法以下:

/* compare.h */

#ifndef __COMPARE_H__

#define __COMPARE_H__


template <class T>

class Compare {

public:

    bool operator()(const T& a, const T& b) const;

};


struct Weight {

    int weight;

};


#endif


/* compare.cpp */

#include "compare.h"


template <class T>

bool Compare<T>::operator()(const T& a, const T& b) const {

    return a < b ? true : false;

}


static bool operator<(const Weight& a, const Weight& b) {

    return a.weight < b.weight ? true : false;

}


template class Compare<int>;

template class Compare<double>;

template class Compare<Weight>;


/* main.cpp */

#include <iostream>

#include "compare.h"

using namespace std;


int main() {

    cout << Compare<int>()(1, 2) << endl;

    cout << Compare<double>()(2.0, 1.0) << endl;

    Weight a, b;

    a.weight = 1;

    b.weight = 2;

    cout << Compare<Weight>()(a, b) << endl;

    return 0;


    重要的3行我用红颜色标注了。在分离编译时,若是没有这三句话,会报 undefined reference to ***。缘由是根据.h和main.cpp文件 编译器没法实例化模板的实现。有了这三句,编译器就事先实例化这几种类型。而后连接就不会出错了。

相关文章
相关标签/搜索