В 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 *));
Я не понимаю, в чем может быть разница, тем не менее, почему ошибка возникает в первую очередь в функции-члене.
Как и предсказывал мой комментарий, оказалось, что вы не включили заголовки в правильном порядке. Ваша реализация была в шапке, и так <cstdlib>
необходимо включить до этого заголовка:
#include <cstdlib> // Required by myclass.h
#include "myclass.h"
Это усложняет ситуацию, когда у вас много исходных файлов, требующих вашего заголовка — каждый исходный файл должен не забывать включать другие заголовки, даже если им не нужны эти заголовки напрямую.
Вот несколько разных стратегий, позволяющих избежать подобных проблем:
Возьмите за правило всегда включать стандартные заголовки и другие заголовки библиотеки (что угодно в угловых скобках) до любые локальные заголовки (что-либо в двойных кавычках) — обратите внимание, что каждый исходный файл все равно должен помнить о необходимости включать обязательные заголовки; или же
Если ваш заголовок использует что-то из другого заголовка, убедитесь, что вы включили требуемые заголовки в свой собственный заголовок (иногда у вас есть взаимозависимые заголовки, и вы не можете этого сделать — вместо этого вы можете заранее объявить материал для одного из этих заголовков); или же
Используйте предварительно скомпилированный заголовок, который требуется для все исходные файлы и поместите в них все общие заголовки (это ленивый подход, но общий для компиляторов Microsoft: т.е. "stdafx.h"
— он имеет практическое применение, когда у вас очень большие заголовки, которые используются повсеместно, и вы хотите сократить время компиляции).
Если вы реализуете код в заголовке, убедитесь, что это по правильным причинам. Если вы просто ленивы и не хотите разбивать его на исходные файлы, это плохая причина. Если это код шаблона, который должен быть определен в заголовке, это веская причина.
Других решений пока нет …