& quot; выражение должно иметь (указатель на) тип функции & quot; на calloc во время выделения 2D-массива

В VS2010 calloc выделяется с ошибкой «выражение должно иметь (указатель на) тип функции» в следующем блоке кода только когда он находится внутри функции-члена класса. Когда он помещен в main(), нет проблем. Нет переменных с именем calloc.

RoadSegment ***map;

map = (RoadSegment ***) calloc(nRows, sizeof(RoadSegment **));
for( int rCur=0; rCur < nRows; ++rCur )
map[rCur] = (RoadSegment **) calloc(nCols, sizeof(RoadSegment *));

Я не понимаю, в чем может быть разница, тем не менее, почему ошибка возникает в первую очередь в функции-члене.

0

Решение

Как и предсказывал мой комментарий, оказалось, что вы не включили заголовки в правильном порядке. Ваша реализация была в шапке, и так <cstdlib> необходимо включить до этого заголовка:

#include <cstdlib>      // Required by myclass.h
#include "myclass.h"

Это усложняет ситуацию, когда у вас много исходных файлов, требующих вашего заголовка — каждый исходный файл должен не забывать включать другие заголовки, даже если им не нужны эти заголовки напрямую.

Вот несколько разных стратегий, позволяющих избежать подобных проблем:

  • Возьмите за правило всегда включать стандартные заголовки и другие заголовки библиотеки (что угодно в угловых скобках) до любые локальные заголовки (что-либо в двойных кавычках) — обратите внимание, что каждый исходный файл все равно должен помнить о необходимости включать обязательные заголовки; или же

  • Если ваш заголовок использует что-то из другого заголовка, убедитесь, что вы включили требуемые заголовки в свой собственный заголовок (иногда у вас есть взаимозависимые заголовки, и вы не можете этого сделать — вместо этого вы можете заранее объявить материал для одного из этих заголовков); или же

  • Используйте предварительно скомпилированный заголовок, который требуется для все исходные файлы и поместите в них все общие заголовки (это ленивый подход, но общий для компиляторов Microsoft: т.е. "stdafx.h" — он имеет практическое применение, когда у вас очень большие заголовки, которые используются повсеместно, и вы хотите сократить время компиляции).

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]