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

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

大家好,又见面了,我是全栈君,今天给大家准备了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;
}

这样即可了!

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Ant Design A-table 表格 后端 排序问题

    Ant Design A-table 表格 后端 排序问题

  • SMBus学习记录

    SMBus学习记录SMBus学习记录SMBus是SystemManagementBus的缩写,译为系统管理总线,SMBus是一种二线制串行总线,1996年第一版规范开始商用。它大部分基于I2C总线规范。Overview系统管理总线(SMBus)是一个双线接口,通过它,各种系统组件芯片和设备可以相互通信,也可以与系统的其余部分进行通信。它基于I2C总线的工作原理。SMBus为系统和电源管理相关任务提供控制总线。系统可以使用SMBus将消息传递到设备和设备之间,而不使用单独的控制线。可减少引脚数。本文档描述了

    2022年10月26日
  • 深入理解HandlerThread

    深入理解HandlerThread以往遇到HandlerThread,对它的认识只是停留在MessageLooperHandler上,知道它有自己的消息队列,仅此而已。随着编程的深入,个人已不再满足表面上的理解,所以再次翻开HandlerThread源码,做梳理记录。HandlerThread集成Thread,并重写了Thread类的run方法(如果我们自定义一个类继承HandlerThread,就用不到run函数了):

  • idea2021.02激活码(注册激活)

    (idea2021.02激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • startActivityForResult无法回调

    startActivityForResult无法回调Android中常常需要用到startActivityForResult()方法来获得Activity回执信息的场景。但有时不注意就会导致onActivityResult()不被调用,或者调用时机错误。以下总结开发中遇到过的两种情况:Fragment在fragment作为调用者使用时需要注意,Fragment有自己的一套API而不是通过其父类API进行调用的,因此调用自己的API时需要重写自己…

  • Qt Mac 在软件 icns图标制作

    Qt Mac 在软件 icns图标制作

发表回复

您的电子邮箱地址不会被公开。

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