我正在使用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"


但这掩盖了一个事实,那就是它实际上全都放到了一个标题中。

09-10 03:26
查看更多