C++ C++;多重c++;文件-ld:未找到架构x86_64的符号
可能重复:C++ C++;多重c++;文件-ld:未找到架构x86_64的符号,c++,templates,linker,compiler-errors,C++,Templates,Linker,Compiler Errors,可能重复: 当我将Stack.cpp放入Stack.h时,它工作得很好,但是当我分离Stack.h、.cpp文件时,它会给出这个错误。 我还有一个main.cpp文件,它除了包含AlgebraicExpression.h之外什么也不做 我使用此命令编译:“g++-o main.cpp AlgebraicExpression.cpp Stack.cpp” Stack.h #ifndef STACK_H #define STACK_H template <class T> class
当我将Stack.cpp放入Stack.h时,它工作得很好,但是当我分离Stack.h、.cpp文件时,它会给出这个错误。 我还有一个main.cpp文件,它除了包含AlgebraicExpression.h之外什么也不做 我使用此命令编译:“g++-o main.cpp AlgebraicExpression.cpp Stack.cpp” Stack.h
#ifndef STACK_H
#define STACK_H
template <class T>
class Stack
{
public:
Stack();
void pop();
T top();
void push(T val);
int size();
T *values;
int maxSize;
int length;
};
#endif
#ifndef堆栈
#定义堆栈
模板
类堆栈
{
公众:
堆栈();
void pop();
T-top();
无效推力(T值);
int size();
T*值;
int-maxSize;
整数长度;
};
#恩迪夫
AlgebraicExpression.cpp
#include "AlgebraicExpression.h"
#include "Stack.h"
using namespace std;
bool isOperator(char c)
{
if(c=='+' || c=='-' ||
c=='*' || c=='/')
return true;
return false;
}
bool isDigit(char c)
{
if(c=='0'||(c>='1'&&c<='9'))
return true;
return false;
}
int compareOperators(char c1,char c2)
{
int v1,v2;
if(!isOperator(c1) || !isOperator(c2))
return -1;
if(c1 == '*' || c1 =='/')v1 = 1;
else v1 = 0;
if(c2 == '*' || c2 == '/')v2 = 1;
else v2 = 0;
return v1-v2;
}
char *infix2postfix(char *infix)
{
int lenIn,lenPost;
for(lenIn=0,lenPost=0;infix[lenIn];++lenIn)
if(infix[lenIn]!='('&&infix[lenIn]!=')')
++lenPost;
char *postfix = new char[lenPost+1];
int i,j;
Stack<char> operations;
for(i=0,j=0;i<lenIn&&j<lenPost;++i)
if(isDigit(infix[i]))
postfix[j++] = infix[i];
else if(isOperator(infix[i]))
{
while(operations.size()&&
compareOperators(operations.top(),infix[i])>-1)
{
postfix[j++] = operations.top();
operations.pop();
}
operations.push(infix[i]);
}
else
{
if(infix[i] == '(')
operations.push(infix[i]);
else if(infix[i] ==')')
{
while(operations.size()&&operations.top()!='(')
{
postfix[j++] = operations.top();
operations.pop();
}
operations.pop();
}
}
while(operations.size())
{
postfix[j++] = operations.top();
operations.pop();
}
postfix[j] = '\0';
return postfix;
}
double evaluatePostfix(char *postfix)
{
Stack<double> result;
for(int i=0;postfix[i];++i)
if(isDigit(postfix[i]))
result.push(postfix[i]-'0');
else
{
double n1,n2,r;
n1 = result.top();
result.pop();
n2 = result.top();
result.pop();
if(postfix[i] == '+')
r = n1+n2;
else if(postfix[i] == '-')
r = n2-n1;
else if(postfix[i] == '*')
r = n1*n2;
else if(postfix[i] == '/')
r = n1/n2;
result.push(r);
}
return result.top();
}
#包括“AlgebraicExpression.h”
#包括“Stack.h”
使用名称空间std;
布尔等参器(字符c)
{
如果(c=='+'| | c=='-'||
c=='*'| | c=='/'))
返回true;
返回false;
}
布尔数字(字符c)
{
如果(c=='0'| |(c>='1'&&c带有类模板所有定义都需要在标题本身中
这是一本好书
基本上,当模板类被实例化时,它需要能够看到类的整个定义,而不仅仅是标题
如果您知道类将要使用的所有类型,您可以用所有这些类型实例化模板,然后将定义保留在cpp中,如前所述
如前所述,这也包含在类模板中中所有定义都需要在标题中
这是一本好书
基本上,当模板类被实例化时,它需要能够看到类的整个定义,而不仅仅是标题
如果您知道类将要使用的所有类型,您可以用所有这些类型实例化模板,然后将定义保留在cpp中,如前所述
如前所述,中也介绍了这一点,如果您确实想分离模板头和实现文件,可以在Stack.h
的底部包含Stack.cpp
,它被称为包含模型
#include "Stack.cpp"
签出引用:
如果您确实想分离模板头和实现文件,可以在Stack.h
的底部包含Stack.cpp
,它被称为包含模型
#include "Stack.cpp"
签出引用:
如果您也能指出感谢您的快速回复,那就更好了。这是我的家庭作业,老师希望我同时提供Stack.h和Stack.cpp。那么,有没有其他方法可以这样做呢?@may00查看billz和我发布的链接。链接的帖子告诉我们如何做that@abhinav这是一个很好的推荐信,谢谢。我不知道问题出在哪里因为模板。我会检查它now@abhinav比尔兹已经指出了这一点,所以我试着涵盖其他领域,让我补充一下。如果你也能指出感谢你的快速回复,那就更好了。这是我的作业,老师希望我同时提供Stack.h和Stack.cpp。那么,还有什么不可以做的吗?@may00查看b发布的链接illz和我。链接的帖子告诉我们怎么做that@abhinav这是一个很好的参考。谢谢。我不知道问题是因为模板。我会检查它now@abhinavbillz已经指出了这一点,所以我试图涵盖其他领域,让我补充一下。@billz谢谢,这帮助很大。我的代码现在运行良好:)@billz谢谢,这帮了大忙。我的代码现在运行良好:)
#include "Stack.h"
template <class T>
Stack<T>::Stack()
{
maxSize = 100;
length =0;
values = new T[maxSize];
}
template <class T>
T Stack<T>::top()
{
return values[length-1];
}
template <class T>
void Stack<T>::push(T val)
{
if(maxSize==length)
{
T *temp = new T[length*2];
for(int i=0;i<length;++i)
temp[i] = values[i];
values = temp;
maxSize = length*2;
}
values[length++] = val;
}
template <class T>
void Stack<T>::pop()
{
if(length>0)
length--;
}
template <class T>
int Stack<T>::size()
{
return length;
}
#include "Stack.cpp"