Я сделал шаблон класса Grid (где я сказал в заголовочном файле, что по умолчанию для T используется float), я процитировал часть исходного файла:
#include"Grid.h"
template <class T>
Grid<T>::Grid(unsigned int rows=1, unsigned int columns=1)
:Rows(rows),Columns(columns)
{
reset();
}
template<class T>
Grid<T>::~Grid(){}
template <class T>
void Grid<T>::reset()
{
vector<T> vec(Rows * Columns,T());
matrix = vec;
}
И другие функции-члены могут читать / изменять значение матрицы или отслеживать его.
Grid.h:
template<typename T=float> class Grid{
public:
Grid(unsigned int, unsigned int);
~Grid();
T getValue(unsigned int, unsigned int);
void setValue(unsigned int, unsigned int, T);
void reset();
void write();
private:
unsigned int Rows;
unsigned int Columns;
vector<T> matrix;
};
В интернете я обнаружил, что для использования шаблонного класса мне нужно было #include Grid.cpp, а также Grid.h, и, делая это, я могу использовать класс clas и его функции-члены в моей функции main (). Я также положил обертку препроцессора вокруг Grid.cpp.
Теперь, когда я пытаюсь построить новый класс PDEProblem, без наследования, но с использованием членов типа Grid, я получаю ошибки:
Error 2 error C2512: 'Grid<>' : no appropriate default constructor available c:\users\... 15
Error 3 error C2512: 'Grid<T>' : no appropriate default constructor available c:\users\... 15
4 IntelliSense: no default constructor exists for class "Grid<float>" c:\Users\... 15
PDEProblem.h:
#include"grid.h"#include"grid.cpp"
class PDEProblem: Grid<>
{
public:
PDEProblem(unsigned int,unsigned int);
~PDEProblem();
//some more other data members
private:
Grid<char> gridFlags;
Grid<> grid;
unsigned int Rows;
unsigned int Columns;
void conPot(unsigned int, unsigned int);
void conFlag(unsigned int, unsigned int);
};
PDEProblem.cpp:
#include"grid.h"#include"grid.cpp"#include "PDEProblem.h"
PDEProblem::PDEProblem(unsigned int rows=1,unsigned int columns=1)
:Rows(rows), Columns(columns)
{
conPot(rows, columns);
conFlag(rows,columns);
}
PDEProblem::~PDEProblem(){}
void PDEProblem::conPot(unsigned int rows, unsigned int columns)
{
grid=Grid<>(rows,columns);
}
void PDEProblem::conFlag(unsigned int rows, unsigned int columns)
{gridFlags=Grid<char>(rows,columns);
// some stuff with a few if and for loops which sets some elements of gridFlags to 1 and the others to 0
}
Как я могу это исправить? Мне кажется, что у меня есть настройки по умолчанию для всего, что имеет отношение к делу?
Спасибо
С моим компилятором (Visual Studio 2010) и вашим кодом я могу устранить вашу ошибку, переместив значения параметров по умолчанию из определения функции в прототип функции. В частности:
Grid.h
template<typename T=float> class Grid{
public:
Grid(unsigned int rows = 1, unsigned int columns = 1);
...
};
Grid.cpp
template <class T>
Grid<T>::Grid(unsigned int rows, unsigned int columns)
:Rows(rows),Columns(columns)
{
reset();
}
Ваша проблема в том, что ваш основной класс наследует от Grid и в то же время содержит два других экземпляра Grid. За исключением плохого дизайна, у вас нет явных конструкторов для ваших двух экземпляров Grid, поэтому у вас есть ошибка.
Установка значений по умолчанию не является правильным способом.