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

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

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


相关推荐

  • S3服务器规格和性能指标,云服务器s3与s4

    S3服务器规格和性能指标,云服务器s3与s4云服务器s3与s4内容精选换一换创建一台或多台云服务器。V1.1版本创建云服务器的接口兼容了V1版本创建云服务器(按需)的功能,同时合入新功能,支持创建包年/包月的弹性云服务器。本接口为异步接口,当前创建云服务器请求下发成功后会返回job_id,此时创建云服务器并没有立即完成,需要通过调用查询任务的执行状态查询job状态,当Job状态为SUCCESS时代表云服务器创在申请SAPS/4HAN…

    2022年5月11日
    59
  • SpringMVC框架理解

    SpringMVC框架理解1.Spring与Web环境集成1.1ApplicationContext应用上下文获取方式应用上下文对象是通过newClasspathXmlApplicationContext(spring配置文件)方式获取的,但是每次从容器中获得Bean时都要编写newClasspathXmlApplicationContext(spring配置文件),这样的弊端是配置文件加载多次,应用上下文对象创建多次。在Web项目中,可以使用ServletContextListener监听Web应用的启动,

    2022年6月22日
    31
  • eclipse生成SO文件「建议收藏」

    eclipse生成SO文件「建议收藏」利用eclipse进行NDK开发(生成SO文件)开发步骤

    2022年9月16日
    3
  • Eurake[通俗易懂]

    Eurake[通俗易懂]eureka-core模块包含了功能的核心实现:1.com.netflix.eureka.cluster-与peer节点复制(replication)相关的功能2.com.netflix.eureka.lease-即”租约”,用来控制注册信息的生命周期(添加、清除、续约)3.com.netflix.eureka.registry-存储、查询服务注册信息4.com.n…

    2022年6月13日
    42
  • docker部署web项目_小钢炮docker安装web

    docker部署web项目_小钢炮docker安装web前言前面我们运行的容器并没有一些什么特别的用处。接下来让我们尝试使用docker构建一个web应用程序。我们将在docker容器中运行一个PythonFlask应用来运行一个web

    2022年7月29日
    7
  • 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景详解java动态代理机制以及使用场景

    2022年4月23日
    72

发表回复

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

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