Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态内存分配模板类_C++_Templates - Fatal编程技术网

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
从来都不是一个好的选择,特别是因为没有人会在那里放置包含保护,并且最终可能会重新定义符号。另外,如果答案有助于你解决问题,不要忘记接受它。