** Этот вопрос сильно отредактирован, чтобы обеспечить (узнав решение) пример проблемы в формате MCVE. MCVE, используемый для решения проблемы, можно найти по адресу this ideone link. ** (Если ideone.com удаляет сообщения, кто-то даёт мне знать!)Возможное недоразумение относительно std :: vector <T> object [arraySize]
Комментарии к этому сообщению включают ссылку на rextester link, у которой есть изменения, предоставленные @dyp (хотя я не знаю, как это может измениться со временем) **
template <typename T, size_t fD, size_t mD>
class Field
{
public:
// Constructor - the problem turned out to be here
Field(const Mesh<mD>& mesh, const std::string &fileName):
fileName_(fileName),
mesh_(mesh)
{
for (size_t d=0; d<fD; d++) {
field_[d].reserve(mesh.numCellS());
}
}
// Copy constructor - maybe I've written this horribly?
Field(const Field<T,fD,mD>& refToCopy, const std::string &name):
fileName_(name),
mesh_(refToCopy.mesh_)
{
for (size_t d=0; d<fD; d++) {
field_[d] = refToCopy.field_[d];
}
}
// Const Accessors
const std::vector<T> &x() const { return field_[0]; }
// some checking that fD is large enough
const std::vector<T> &y() const { return field_[1]; }
// Repeated, non-const.
void setZero();
void setFixed(const T &val);
private:
std::vector<T> field_[fD];
}
template<typename T, size_t fD, size_t mD>
void Field<T,fD,mD>::setZero()
{
setFixed(T(0));
}
// This might need to be explicit.
// Currently, 'a' can be converted for Field<double, D>
template<typename T, size_t fD, size_t mD>
void Field<T,fD,mD>::setFixed(const T &val)
{
for (size_t d=0; d<fD; d++) {
std::fill(field_[d].begin(), field_[d].end(), val);
}
}
Когда я пытаюсь получить доступ к значениям скопированного поля (не один построено с нуля), я получаю ошибку сегментации. Размещение std::cout << "field_[" << d << "][" << i << "] = " << field_[d][i]
внутри цикла над i
внутри копирования конструктор также бросает эту проблему (без какого-либо выхода, так что предположительно на первом значении i
...
Пример вызова может быть:
Field<double, 2, 2> fieldA(constructor arguments);
fieldA.setZero(); // <- This is what I misunderstood
Field<double, 2, 2> fieldB(fieldA, "copyOfFieldA");
std::cout << "fieldB.x()[5] = " << fieldB.x()[5] << std::endl;
Где я не ошибаюсь? Должен ли я вместо этого использовать std::array<std::vector<T>>
? Является ли это недопустимым способом доступа к полю? Или мой экземпляр-копирайтер просто неактивен (подозрительный случай).
[Работает для меня] (http://rextester.com/YFCTK56876). MCVE или этого не произошло. –
Я понятия не имею, какое странное расширение gcc позволяет это скомпилировать: 'field_ (refToCopy.field_)' Это незаконно; вы не можете скопировать массив через прямую инициализацию. clang ++ жалуется на это. Поскольку ваша копия ctor не делает ничего особенного, почему бы вам просто не оставить ее? – dyp
[Эта ссылка] (http://rextester.com/live/QQW10887) должна скомпилировать и показать ошибку – chrisb2244