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

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

大家好,又见面了,我是全栈君,今天给大家准备了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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 目标检测—利用labelimg制作自己的深度学习目标检测数据集

    目标检测—利用labelimg制作自己的深度学习目标检测数据集看了网上的xml转txt的博客很多上来就给代码,关于怎么用都不说,有的也用不了,所以这里自己写了一份代码

    2022年6月15日
    48
  • lx文件用什么打开_lservrc文件怎么生成

    lx文件用什么打开_lservrc文件怎么生成介绍两款播放器:第一款:PotPlayer,这款软件快进看学习视频特特别方便。软件的下载地址:链接:http://potplayer.daum.net/?lang=zh_CN第二款:屏幕录像专家

    2022年8月4日
    7
  • 频谱分析仪知识_频谱分析仪

    频谱分析仪知识_频谱分析仪17年电赛的元器件清单下来了,基本仪器有频率特性测试仪,且13年国赛出现过,15年国赛也出现过频谱分析仪,知乎上有人猜测今年依然会出频域测量的题,这几天我就找了不少资料。了解了频谱分析仪和频率特性测试仪的原理。—————————————————————————————————————————————————————频谱分析仪     频谱分析仪主要用来分析信号中各频率成分。主要有多滤

    2022年8月11日
    7
  • leetcode_1049. Last Stone Weight II_[DP]

    leetcode_1049. Last Stone Weight II_[DP]

    2021年7月7日
    97
  • 软件封装工具(牛人自制升降工具)

    平时Java项目的开发通常需要统一管理日志(Log)的输出,例如控制日志信息输送的目的地(控制台、文件等),控制每一条日志的输出格式,把日志分为不同的级别等。常用的比较成熟的Java日志管理工具有Apache的Log4j等。但有时我们平时一时兴趣想写个小Dmeo或小工具,想较好的控制日志的输出,引入专业的日志管理库又显得比较繁琐,下面我就自己封装一个简单的日志工具类(LogUtils.java)。

    2022年4月13日
    41
  • android toast显示时间,Android Toast自定义显示时间「建议收藏」

    android toast显示时间,Android Toast自定义显示时间「建议收藏」Toast是Android中使用频率较高的弹窗提示手段,使用起来简单、方便。常规使用方法这里不做说明,继前一篇博客《Android中Toast全屏显示》,其中抛砖引玉的给出一个简单的实现Toast全屏显示的方法后,发现无法控制Toast的显示时长。虽然Toast中有setDuration(intduration)接口,但是跟踪代码发现,设置的时间没起作用,只有系统默认的两个时间LENGTH_D…

    2025年11月10日
    10

发表回复

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

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