2014-01-22 53 views
0

在VS2010中,只有在以下代碼塊中出現錯誤」表達式必須具有(指針指向)函數類型「時,纔會高亮顯示calloc位於類的成員函數內部。當它被放置在main()時,沒有問題。沒有名爲calloc的變量。「在二維數組分配過程中,calloc中的」表達式必須具有(指向)函數類型「

RoadSegment ***map; 

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

我不明白什麼區別可能是,但爲什麼錯誤發生在成員函數的第一位。

+0

對不起,我有一個無關的問題,但是當你用'sizeof(RoadSegment **)'調用'calloc'' ......這是否意味着你正在爲指針分配空間? – BWG

+1

我的猜測是一個#define的東西,它以一種在特定類方法內不兼容的方式定義了'calloc'。爲什麼你在第一個地方使用'calloc()'而不是'std :: vector'? –

+0

只#定義我是爲NULL。使用calloc進行練習 – vlad417

回答

1

正如我的評論所預測的,事實證明,您沒有按照正確的順序包含您的標題。你的實現是在一個頭,所以<cstdlib>需要納入該頭前:

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

這使事情變得困難時,你有很多需要你的頭源文件 - 每個源文件都必須記住,包括其他頭,即使他們不直接需要這些標題。

下面是避免這種問題的一些不同的策略:

  • 做的始終,包括標準的頭和其他庫頭(在尖括號任何東西)習慣之前的任何地方標題(什麼在雙引號中) - 請注意,每個源文件仍必須記住包含必備標題;或

  • 如果您的標題使用其他標題的內容,請確保您在自己的標題中包含必需的標題(有時您擁有相互依賴的標題並且無法執行此操作 - 相反,您可以轉發 - 這些標題);或

  • 使用需要所有源文件,並把所有的公共報頭在那裏(這是偷懶的做法,但常見的微軟編譯器的預編譯的頭:"stdafx.h" - 具有實用當你有非常大的頭文件被使用,並且你想減少編譯時間時使用)。

如果您在頭中實現代碼,請確保它是出於正確的原因。如果只是懶惰而不想將其分解爲源文件,那是一個不好的理由。如果它是模板代碼,必須在標題中定義,這是一個很好的理由。

+1

我建議第二個項目符號以及編碼標準:「如果包含在源文件的第一行(或唯一)行中,每個標題都應該有效。」 – aschepler

+0

是的,我同意你@aschepler - 一個標題是提供一個接口,你不需要知道實現細節。所以你應該能夠只包含標題。 – paddy

相關問題