Я получаю сообщение об ошибке «функция-член не объявлена ​​в классе» в конструкторе копирования при компиляции шаблонного класса - PullRequest
0 голосов
/ 08 июня 2009

Я использую C ++ и пытаюсь создать шаблонный класс (стек). Я хотел бы определить конструктор копирования и оператор присваивания.

Они определены в заголовке, а затем я реализую их в файле cpp.

Вот проблемы, которые я получаю: - Для конструктора копирования: прототип ‘Stack :: Stack (const Stack &)’ не соответствует ни одному в классе ‘Stack’ - Для оператора присваивания: stack.cpp: 28: ошибка: нет функции-члена Stack & Stack :: operator = (const Stack &) ', объявленной в классе' 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>’

Я уверен, что это только небольшая ошибка при опечатке, но я не могу ее найти. Спасибо за вашу помощь

1 Ответ

4 голосов
/ 08 июня 2009

Вы не можете скомпилировать шаблоны в отдельные блоки компиляции. Короче говоря, весь код шаблона должен быть в одном заголовке. Это может быть причиной вашей проблемы.

Причина в том, что шаблоны не определяют истинные классы. Шаблоны определяют, как код может быть сгенерирован. Поэтому, когда вы делаете

 Stack<int> myStack;

Компилятор использует шаблон для генерации конструктора копирования:

 Stack<int>::Stack<int>( const Stack<int>& src);

Это совершенно другой тип, чем

 Stack<float>

, который определит полностью независимый конструктор копирования и полностью независимый набор методов.

Один вариант, который многие используют, состоит в том, чтобы включить cpp в заголовок в обратном порядке.

то есть в Stack.hpp, внизу

#include "Stack.cpp"

но это как бы скрывает тот факт, что на самом деле все это просто шлепнулось в один заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...