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

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

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


相关推荐

  • Qt版音乐播放器[通俗易懂]

    Qt版音乐播放器[通俗易懂]Qt版音乐播放器转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907一、关于Qt1.1什么是Qt   Qt是一个跨平台应用程序和UI开发框架。使用Qt只需一次性开发应用程序,无需重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。   QtCreator是全新的跨平台QtIDE,可单独使用,也可与Qt库

    2022年6月4日
    47
  • Schrodinger分子动力模拟软件与UltraLAB建模工作站配置探讨

    Schrodinger分子动力模拟软件与UltraLAB建模工作站配置探讨Schrodinger2018-1是Schrodinger软件的最新版本,也是目前计算化学领域的领导者,能够为生命科学和材料研究提供软件解决方案和服务。该软件并不是独立,而是一个软件合集包,由maestro、maesrtoelements、materialsscience、bioluminate、knime、canvas、mmshare、aacg、Glide、Impact、Jagua…

    2022年5月25日
    43
  • 通信信道带宽为1Gbit/s,端到端时延为10ms。TCP的发送窗口为65535字节。试问: 可能达到的最大吞吐量是多少?信道的利用率是多少?

    通信信道带宽为1Gbit/s,端到端时延为10ms。TCP的发送窗口为65535字节。试问: 可能达到的最大吞吐量是多少?信道的利用率是多少?通信信道带宽为1Gbit/s,端到端时延10ms。TCP的发送窗口为65535字节。试问:一可能达到的最大吞吐量是多少?信道的利用率是多少?由发送时延=数据长度/信道带宽=655358bit/1Gb/s=0.5242810-3s=0.52428ms来回的传播时延=10ms2=20ms总时延=20.52428ms所以每秒可以产生1000/20.52428个窗口最大吞吐量=6553681000/20.52428=25544769bit/s信道利用率=最大吞吐量/信道带宽=25544769bit/s/

    2022年10月11日
    8
  • cas6.2整合springboot入坑指南

    cas6.2整合springboot入坑指南

    2020年11月9日
    346
  • Python requests post 请求报错:415 Unsupported Media Type

    Python requests post 请求报错:415 Unsupported Media Type本文仅供学习交流使用,如侵立删!联系方式及demo下载见文末requestspost请求报错:415UnsupportedMediaType在使用response.post发送json数据时,出现如题所示错误,是因为User-Agent被服务器设置拒绝请求了解决方法:’content-type’:’application/json’headers={‘User-Agent’:’Dalvik/2.1.0(Linux;U;Android6.0.1;Nexus5

    2022年6月12日
    91
  • 长轮询的使用实现_长轮询和短轮询

    长轮询的使用实现_长轮询和短轮询轮询(Polling):是指不管服务器端有没有更新,客户端(通常是指浏览器)都定时的发送请求进行查询,轮询的结果可能是服务器端有新的更新过来,也可能什么也没有,只是返回个空的信息。不管结果如何,客户端处理完后到下一个定时时间点将继续下一轮的轮询。长轮询(LongPolling):长轮询的服务其客户端是不做轮询的,客户端在发起一次请求后立即挂起,一直到服务器端有更新的时候,服务器才会主动推送信息到…

    2025年6月17日
    1

发表回复

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

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