我正在尝试为我创建的这个类创建一个动态内存:
#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
src文件:
#include "stack.h"
#include <cstddef>
template <class T>
stack<T>::stack(){
head=nullptr;
}
驱动器:
#include "stack.h"
#include <iostream>
#include <memory>
int main(){
stack<double> oneStack();
stack<double> * oneStack2=new stack<double>;
}
编译代码时出现以下错误:
g ++ -Wall driver.o Link.o stack.o -o driver.exe
driver.o:在函数main':
driver.cpp:(.text+0x1c): undefined reference to
stack :: stack()'
由于某些原因使用new关键字导致此错误?
答案 0 :(得分:3)
当你编写模板类时,你需要在声明它的同一个地方定义函数,所以你应该像这样写它
#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
编译器需要在同一位置声明和定义模板类和函数的原因是它实际上为代码中使用的每组不同的模板参数生成一个新类。因此,假设您有.h
文件,其中包含模板类的声明及其方法,并且您有一个.cpp
文件,其中定义了这些方法。编译器尝试将.cpp
文件编译为.obj
文件,该文件稍后将用于将代码链接到单个可执行文件或库文件中。但它不能这样做,因为它现在没有模板参数在这个文件中,所以它实际上不能为具体参数生成具体代码。这样的事情。
如果您想要更好的见解,可以查看此处:http://isocpp.org/wiki/faq/templates#templates-defn-vs-decl