我正在使用C ++,正在尝试创建模板化的类(堆栈)。
我想定义复制构造函数和赋值运算符。
标头中有定义,然后在cpp文件中实现它们。
这是我遇到的问题:
-对于复制构造函数:
“ Stack :: Stack(const Stack&)”的原型与“ Stack”类中的任何内容都不匹配
-对于分配运算符:
stack.cpp:28:错误:没有在类“ Stack”中声明的“ Stack&Stack :: operator =(const Stack&)”成员函数
-对于构造函数:
stack.cpp:4:错误:候选者是:Stack :: Stack()
这是头文件:
// stack.hpp
#ifndef STACK_HPP
#define STACK_HPP
#include <stdio.h>
#include <assert.h>
template <class T>
class Stack
{
public:
Stack();
~Stack();
Stack(const Stack&);
Stack& operator=(const Stack&);
private:
T* v_;
size_t vsize_;
size_t vused_;
};
这是cpp文件:
// stack.cpp
#include "stack.hpp"
template <class T>
Stack<T>::Stack() :
v_(0),
vsize_(10),
vused_(0)
{
v_ = new T[vsize_];
}
template <class T>
Stack<T>::~Stack()
{
delete[] v_;
}
// Stack(const Stack&);
template <class T> Stack<T>::Stack( const Stack<T>& other) :
v_(NewCopy(other.v, other.vsize_, other.vsize_)),
vsize_(other.vsize_),
vuser_(other.vused)
{
}
// Stack& operator=(const Stack&);
template<class T> Stack<T>& Stack<T>::operator=(const Stack<T>& other)
{
if (this != &other)
{
T* v_new = NewCopy(other.v_, other.vsize_, other.vsize__;
delvete v_;
v_ = v_new
vsize_ = other.vsize_;
vused_ = other.vused_;
}
return *this
}
最后一件事,这是编译日志:
g++ -c stack.cpp -o stack.o
stack.cpp:20: error: prototype for ‘Stack<T>::Stack(const Stack<T>&)’ does not match any in class ‘Stack<T>’
stack.cpp:4: error: candidate is: Stack<T>::Stack()
stack.cpp:28: error: no ‘Stack<T>& Stack<T>::operator=(const Stack<T>&)’ member function declared in class ‘Stack<T>’
我确定这只是一个很小的错字错误,但我似乎找不到它。
谢谢你的帮助
最佳答案
您不能将模板编译成单独的编译单元。简而言之,所有模板代码必须全部在一个标头中。这可能是引起您问题的原因。
原因是模板没有定义真正的类。模板指定如何生成代码。所以当你做一个
Stack<int> myStack;
编译器使用模板生成副本构造函数:
Stack<int>::Stack<int>( const Stack<int>& src);
这与
Stack<float>
它将定义一个完全独立的副本构造函数和一组完全独立的方法。
许多用途的一种选择是以相反的方式将cpp包含在标头中。
即在Stack.hpp中,在底部
#include "Stack.cpp"
但这掩盖了一个事实,那就是它实际上全都放到了一个标题中。