C++ 动态内存分配模板类
我正在尝试为我创建的此类创建动态内存:C++ 动态内存分配模板类,c++,templates,C++,Templates,我正在尝试为我创建的此类创建动态内存: #ifndef STACK_H #define STACK_H #include <stdexcept> #include "Link.h" template <class T> struct stack{ Link<T> * head; stack(); void push(T * data); T* top(); T* pop(); voi
#ifndef STACK_H
#define STACK_H
#include <stdexcept>
#include "Link.h"
template <class T>
struct stack{
Link<T> * head;
stack();
void push(T * data);
T* top();
T* pop();
void cleanup();
};
#endif
#ifndef堆栈
#定义堆栈
#包括
#包括“Link.h”
模板
结构堆栈{
链接*头;
堆栈();
无效推送(T*数据);
T*top();
T*pop();
空洞清理();
};
#恩迪夫
src文件:
#include "stack.h"
#include <cstddef>
template <class T>
stack<T>::stack(){
head=nullptr;
}
#包括“stack.h”
#包括
模板
stack::stack(){
水头=零PTR;
}
司机:
#include "stack.h"
#include <iostream>
#include <memory>
int main(){
stack<double> oneStack();
stack<double> * oneStack2=new stack<double>;
}
#包括“stack.h”
#包括
#包括
int main(){
stack oneStack();
stack*oneStack2=新堆栈;
}
编译代码时,出现以下错误:
g++-Wall driver.o Link.o stack.o-o driver.exe
驱动程序:在函数main'中:
driver.cpp:(.text+0x1c):对
stack::stack()的未定义引用
由于某种原因,使用new关键字会导致此错误?在编写模板类时,需要在声明函数的同一位置定义函数,因此可能应该这样编写
#ifndef STACK_H
#define STACK_H
#include <stdexcept>
#include "Link.h"
template <class T>
struct stack{
Link<T> * head;
stack()
{
// Constructor code goes here
}
void push(T * data)
{
// Method code goes here
}
T* top()
{
// Method code goes here
}
T* pop()
{
// You get the idea
}
void cleanup()
{
// ...
}
};
#endif
#ifndef堆栈
#定义堆栈
#包括
#包括“Link.h”
模板
结构堆栈{
链接*头;
堆栈()
{
//构造函数代码在这里
}
无效推送(T*数据)
{
//方法代码在这里
}
T*top()
{
//方法代码在这里
}
T*pop()
{
//你明白了吗
}
空洞清理()
{
// ...
}
};
#恩迪夫
编译器需要在同一位置声明和定义模板类和函数的原因是,它实际上为代码中使用的每一组不同的模板参数生成一个新类。因此,假设您有一个带有模板类及其方法声明的.h
文件,您有一个.cpp
文件,其中定义了这些方法。编译器尝试将.cpp
文件编译成.obj
文件,该文件稍后将用于将代码链接到单个可执行文件或库文件中。但是它不能这样做,因为它现在在这个文件中没有模板参数,所以它实际上不能为具体的参数生成具体的代码。像这样的
如果您想了解更多信息,可以查看此处:请不要发布行号,当然在标题中有模板定义。因为我通常使用typename,所以在结构中使用
模板
是否合法。@UnrationalPerson:因为在这种情况下,struct
只不过是一个类
,可以有一个构造函数。@非理性的人有一个带构造函数的结构是合法的。@DieterLücking为什么没有行号?是不是因为这个问题没有显示编译器错误,而行号有助于引用这些错误?或者,一般来说,这条准则有什么原因吗?他可以将函数定义保存在.hpp中。它只需要是可见的,例如,一个头文件就足够了。看起来我以前在driver.cpp中包含了.cpp。这就解释了为什么当我使用单独编译时,我的程序会出现上述错误。感谢您的清晰解释。另外,在创建.o文件时,默认情况下它似乎提供了int参数。没问题。包含.cpp
从来都不是一个好的选择,特别是因为没有人会在那里放置包含保护,并且最终可能会重新定义符号。另外,如果答案有助于你解决问题,不要忘记接受它。