Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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,我正在做一些练习,并试图将一个简单的类转换为模板类。 更改代码后,我遇到了一系列链接器错误,因此我从实现中删除了头文件包含语句,现在将实现文件包含在头文件的底部。从那以后,我就犯了一个奇怪的语法错误:缺少“;”在“之前,我猜您正在尝试编译.cpp文件。尽管文件扩展名令人困惑,但它不是一个完整的翻译单元,因此无法自行编译。只需包含使用该类的任何文件的头 就我个人而言,我会将实现移到头文件中;其他人可能会给它一个不同的文件扩展名,它看起来不像是可编译的源文件(我见过用于此类文件的.tcc和.inl,

我正在做一些练习,并试图将一个简单的类转换为模板类。
更改代码后,我遇到了一系列链接器错误,因此我从实现中删除了头文件包含语句,现在将实现文件包含在头文件的底部。从那以后,我就犯了一个奇怪的语法错误:缺少“;”在“之前,我猜您正在尝试编译
.cpp
文件。尽管文件扩展名令人困惑,但它不是一个完整的翻译单元,因此无法自行编译。只需包含使用该类的任何文件的头

就我个人而言,我会将实现移到头文件中;其他人可能会给它一个不同的文件扩展名,它看起来不像是可编译的源文件(我见过用于此类文件的
.tcc
.inl
,但没有通用的约定)

此外:

模板
typename T Stack::top()常量
^^^^^^^^^

删除
typename
;您只需将其放在依赖于模板参数的类型名称之前。

也许查看它提供的行号会有所帮助……我不太擅长编写模板,但您不需要在类本身内部实现模板类的成员函数体吗?我的意思是,考虑到每个文件都需要知道如何重新生成类,我想通过在头文件的底部包含实现文件,我就可以解决这个问题了@user1290709:您是否正在尝试编译
.cpp
文件并从标题中包含它?如果是这样,那么这就是你的问题,也是大多数人不使用
.cpp
作为模板实现的扩展名的原因。请将所有内容都放在头文件中。清除cpp文件。不要在构造函数中使用“buffer=new t;”,因为它与delete[]不一致。根据经验,总是从一些已经开始工作的事情开始:在转换现有模板类之前,尝试创建一个新的、非常简单的模板类。
#ifndef STACK_H
#define STACK_H

#include <iostream>

template<class T>
class Stack
{
    T* buffer;
size_t count;
public:
Stack();
~Stack();
void push(T value);
void pop();
T top() const;
size_t size() const;
};

#include "Stack.cpp"

#endif
template<class T>
Stack<T>::Stack() : count(0)
{
buffer = new T;
}

template<class T>
Stack<T>::~Stack()
{
delete[] buffer;
}

template<class T>
void Stack<T>::push( T value )
{
if(size() == 0) *(buffer) = value;
else
{
    T* newBuffer = new T[count+1];

    for(size_t i=0; i <= size(); ++i)
        newBuffer[i] = buffer[i];

    newBuffer[count] = value;
    buffer = newBuffer;
}
++count;
}

template<class T>
void Stack<T>::pop()
{
if(size() <= 0) return;

 buffer[size()-1]=0;
 --count;
}
template<class T> 
typename T Stack<T>::top() const
{
if(size() <= 0) 
{
std::cout << "the stack is empty" << std::endl;
return -1;
}
else
{
    return buffer[size()-1];
}
}

template<class T>
size_t Stack<T>::size() const
{
return count;
}
template<class T> 
typename T Stack<T>::top() const
^^^^^^^^^