2013-10-16 46 views
1

我有模板實例化一個宏定義,看起來大約是這樣的:#include和copy&paste有什麼區別?

#define INSTANTIATE_TEMPLATE(typeName) \ 
    template FooBarImpl<C##typeName>; 

所以它並沒有真正做很多工作。 接下來,我對這個宏有大量的調用。

INSTANTIATE_TEMPLATE(OneType) 
INSTANTIATE_TEMPLATE(AnotherType) 
INSTANTIATE_TEMPLATE(TypeThree) 

等等...... 這似乎工作正常。我只是試圖建立一個包括只包含那些最後幾行,並與

#include "instantiations.hpp" 

取代了線。然而,這個新版本不編譯實例。看起來,當模板被實例化時,文件頂部的所有包含都是不可見的。

引述MS docs

#include指令告訴預處理器把一個指定的文件的內容,如果這些內容已經在其中的指令出現的點源項目出現了。

因此,我認爲這是某種排序問題的方式#includes和宏由預處理器進行評估。但是它是如何工作的?發生了什麼?

+0

我也嘗試徹底刪除宏並把模板FooBarImpl ; ...文件中的定義和#include。相同的錯誤,所以可能不是訂購問題。 – Sarien

+0

你能否提供[SSCCE](http://sscce.org/)? – Angew

+0

答案:沒有區別 – sellibitze

回答

1

這是尷尬。

問題是我有包含錯誤的名稱。有兩個文件具有幾乎相同的名稱,並且我自動完成了錯誤的名稱並且從未發現過。這些名字真的很差(我不知道其他的存在),只是在「...屬性...」和「......屬性...」之間有所不同。

我不確定要從這裏拿走什麼。也許我應該使用「打開文檔」快捷方式,而不是點擊打開的選項卡。

+0

@ BrianTompsett-湯萊恩好吧。 – Sarien

0

您必須在定義INSTANTIATE_TEMPLATE後包含它。

+0

是的,我做到了。 – Sarien

+0

你得到了什麼確切的錯誤?它似乎對我來說工作得很好。 –

+0

C2039,C2146,C4430,C2602,C2868 ......它基本上看起來像是一些包含丟失。這是一個巨大的項目,所以我不確定把它切成一個最小的例子是可行的。 – Sarien

0

我想Visual Studio試圖編譯.hpp文件,就好像它是一個.cpp文件。當由其自身編譯時,當從另一個文件中包含#include時,它沒有包含它之前的#includes。

拉起.hpp的屬性,並確保在Configuration Properties - > General下,它將Item Type列爲「C/C++頭文件」。

+0

它沒有列出項目類型爲C/C++頭。 – Sarien

相關問題