定义和实现模板类不能在同一个文件

定义和实现模板类不能在同一个文件

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

        写c++我们常常定义程序的功能将在撰写xxx.h在。写在功能的执行xxx.cpp, 但是,当我们用写模板函数和类,写

将失败,如下面:

stack.h

//stack.h
#ifndef STACK_HPP
#define STACK_HPP

#include <vector>
#include <stdexcept>

template<typename T, typename TContainer = std::vector<T>>
class CStack
{
public:
	void push(const T& vValue);
	void pop();
	T top() const;
	bool empty() const {return m_Container.empty();}
private:
	TContainer m_Container;
};

#endif

stack.cpp

#include "stack.h"
template<typename T, typename TContainer>
void CStack<T, TContainer>::push(const T& vValue)
{
	m_Container.push_back(vValue);
}

template<typename T, typename TContainer>
void CStack<T, TContainer>::pop()
{
	if (empty()) throw std::out_of_range("Stack::pop: empty stack\n");
	m_Container.pop_back();
}

template<typename T, typename TContainer>
T CStack<T, TContainer>::top() const
{
	if (empty()) throw std::out_of_range("Stack::top: empty Stack\n");
	return m_Container.back();
}

然后在main函数中測试就会出错:

#include "stack.h"

int main()
{
       stack<int> IntStack;
       ....
}

曾经总是没办法,仅仅能把定义和实现写在同一个文件里。今天最终找到一种解决方法

首先定义 stack.hpp。类的定义

#ifndef STACK_HPP
#define STACK_HPP

#include <vector>
#include <stdexcept>

template<typename T, typename TContainer = std::vector<T>>
class CStack
{
public:
	void push(const T& vValue);
	void pop();
	T top() const;
	bool empty() const {return m_Container.empty();}
private:
	TContainer m_Container;
};

#endif

然后定义stackdef.hpp 来实现模版中定义的函数

#ifndef STACKDEF_HPP
#define STACKDEF_HPP

#include "stack.hpp"
template<typename T, typename TContainer>
void CStack<T, TContainer>::push(const T& vValue)
{
	m_Container.push_back(vValue);
}

template<typename T, typename TContainer>
void CStack<T, TContainer>::pop()
{
	if (empty()) throw std::out_of_range("Stack::pop: empty stack\n");
	m_Container.pop_back();
}

template<typename T, typename TContainer>
T CStack<T, TContainer>::top() const
{
	if (empty()) throw std::out_of_range("Stack::top: empty Stack\n");
	return m_Container.back();
}

#endif

最后測试

#include "stack_def.hpp"

int main()
{
	CStack<int> IntStack;
	IntStack.push(1);

	system("pause");
	return 0;
}

这样即可了!

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117463.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • termux安装gcc

    termux安装gcc最近在手机上(termux)需要用到gcc以下方法若不想太慢的话,自行科学上网先安装golangpkginstallgolang安装gcc在这里需要添加一下源在该文件下添加$PREFIX/etc/apt/sources.list源vi$PREFIX/etc/apt/sources.list没有vi的使用vim,或者pkginstallvim添加源​debhttps:/…

    2022年5月9日
    60
  • Rsync详解_反向ssh

    Rsync详解_反向sshRsync介绍一、什么是rsyncrsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remotesync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。  在同步备份时,默认情况下,rsync通过其独特的“quickcheck”算法,仅同步大小…

    2022年10月13日
    0
  • 逆向-加壳工具介绍

    逆向-加壳工具介绍经过两周尝试手动编写加壳程序,目前也只是能实现给PE文件添加新区块,后面还有重定位表的修复,地址输入表的处理,虚拟机和花指令技术等反调试手段…一大串要学习的工作,几乎就是放弃了吧,通过这两周学习能让自己对PE文件和偏移地址、虚拟地址有一定了解也算不亏。目前就是转而向使用工具方向了。目前加壳的两个主要方向是压缩和加密。压缩壳压缩壳以UPX为代表,使用方法在前面的文章中有,此类壳的功能已压缩为主,对文件的加密效果几乎没有,Peid等侦壳工具可以轻而易举地发现这些壳,相应也有较成熟的脱壳机来实现。所以当文件

    2022年6月27日
    30
  • 2022年 2月19运维面试题

    2022年 2月19运维面试题 

    2022年5月30日
    27
  • 在HTML中的下拉框中怎样实现超连接?

    在HTML中的下拉框中怎样实现超连接?

    2021年10月20日
    51
  • 一小伙使用 python爬虫来算命?

    一小伙使用 python爬虫来算命?文章目录前言1.网站分析2.获取内容3.代码4.实操5.代码整合前言相信在日常生活中,平常大家聚在一起总会聊聊天,特别是女生(有冒犯的doge)非常喜欢聊星座,这个男生什么星座呀,那个男生什么星座呀…今天我就来满足各位的需求,通过爬虫来知晓上天的安排:开搞!1.网站分析第一步呢,咋们先打开这个网站:https://www.horoscope.com/us/index.aspx大家就能看到这个页面了我们今天呢,就先做一个通过星座来得知三天的运势的小玩意,这里有十二个星座,我点了第一个和第二个

    2022年7月25日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号