Ошибка C2995: шаблон функции уже определен.Не найдена округлость - PullRequest
0 голосов
/ 22 февраля 2019

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

arrayi.cpp:

#include "arrayi.h"

// Member function definitions for class Array

// Initialize static data member at file scope
template<typename T>
int Array<T>::arrayCount = 0;   // no objects yet

// Default constructor for class Array
template<typename T>
Array<T>::Array(int arraySize)
{
    ++arrayCount;             // count one more object
    size = arraySize;         // default size is 10
    ptr = new int[size];      // create space for array
    assert(ptr != 0);  // terminate if memory not allocated
    int i;
    for (i = 0; i < size; i++)
        ptr[i] = 0;            // initialize array
}

arrayi.h:

#ifndef ARRAYI_H_
#define ARRAYI_H_

#include <iostream>
#include <cstdlib>
#include <cassert>
using namespace::std;




template<typename T> class Array;
template<typename T>
ostream &operator<< (ostream& output, const Array<T> &a);





template<typename T>
class Array
  {
    friend ostream &operator<< <>(ostream &output, const Array<T> &a);


  public:
    Array(int = 10);    //constructor
    Array(const Array &);   //copy constructor


  private:
      int *ptr; //ptr to first array element
      int size; //size of the array
      static int arrayCount;    // #of arrays instantiated
 };

#include "arrayi.t"

#endif

arrayi.t:

#ifndef ARRAYI_T_
#define ARRAYI_T_

#include <iostream>
#include <cstdlib>
#include <cassert>
using namespace::std;

// Default constructor for class Array
template<typename T>
Array<T>::Array(int arraySize)
{
cout << "calling the constructor \n";

}




// Overloaded output operator for class Array
template<typename T>
ostream &operator<<(ostream &output, const Array<T> &a)
{

  int i;
  output << "{ ";

  for (i = 0; i < a.size; i++)
    {
      output << a.ptr[i] << ' ';

      if ((i + 1) % 10 == 0)
        output << "}" << endl;
    }  //end for

  if (i % 10 != 0)
    output << "}" << endl;

  return output;   // enables cout << x << y;
}


#endif

Я сканировал свойкодировать вверх и вниз в течение довольно нескольких часов, поэтому любая помощь будет высоко ценится, спасибо заранее!Любой грязный или не выглядящий код может быть вызван тем, что это из-за незавершенного процесса, но в настоящий момент ошибок нет, кроме упомянутой.Все показанное компилируется, когда функция "Array :: Array (int arraySize)" удалена.

1 Ответ

0 голосов
/ 22 февраля 2019

arrayi.t определяет

Array<T>::Array(int arraySize)
{
cout << "calling the constructor \n";

}

arrayi.cpp определяет

template<typename T>
Array<T>::Array(int arraySize)
{
    ++arrayCount;             // count one more object
    size = arraySize;         // default size is 10
    ptr = new int[size];      // create space for array
    assert(ptr != 0);  // terminate if memory not allocated
    int i;
    for (i = 0; i < size; i++)
        ptr[i] = 0;            // initialize array
}

Два определения одной и той же функции с одинаковыми параметрами не допускаются.

Решение:

Выберите тот, который является настоящим конструктором.Удалить другой.Если вы выбираете реализацию в файле arrayi.cpp, убедитесь, что она видна единицам перевода , которые в ней нуждаются.Скорее всего, это означает, что нужно переместить его в arrayi.t.

Дать Статическая переменная шаблона чтение для хедс-апа о другой проблеме, возникшей на вашем пути.

...