我有以下一段代碼,它不在Visual C++ 2015下編譯,但在GCC 4.8.4下。我想知道哪個是對的?有問題的代碼是在這裏如下:將說明符覆蓋爲模板參數 - 是否有效?
template <class T> class ATemplate;
template <class R, class A1>
struct ATemplate<R(A1)>{ };
int main()
{
ATemplate<void(int)> x;
// ATemplate<void(int)override> y; //---Does not compile!!!
return 0;
}
這是錯誤的下面這裏(或常量)使用覆蓋爲符。 GMock庫中存在類似的代碼,其中宏擴展用於生成模板參數(包括覆蓋)以及實際函數簽名。除去註釋掉線時
的Visual C++ 2015產生以下錯誤:
x.cpp(11): error C2062: type 'int' unexpected
x.cpp(11): error C2976: 'ATemplate': too few template arguments
x.cpp(4): note: see declaration of 'ATemplate'
x.cpp(11): error C2079: 'y' uses undefined class 'ATemplate'
一下面提及的是覆蓋處於自由函數(有效點)的上下文中無意義的答案 - 執行此這意味着GCC在這裏是錯誤的。 常量說明符在這種情況下也是沒有意義的(對於自由函數),但是允許(通過VC++)?此外,它還提到虛擬說明符應該只存在於聲明中 - 這對這種情況沒有任何影響(因爲沒有定義)。對於虛擬關鍵字,可以在派生中省略,因爲代碼編譯沒有區別,但對於覆蓋情況,它不是好的,因爲它有很大的區別。
當使用返回類型(ArgType ARG)...可能const或重寫符作爲宏參數(像GMock一樣),由VCC施加的限制導致該代碼不編譯(顯然爲鏘的情況下也是如此) 。哪個是對的?
該標準沒有說明覆蓋說明符不應該在這個上下文中使用(模板參數的上下文嗎?),是嗎?
來看由票我可能失去了一些東西很明顯,但如果是你想要覆蓋的功能? –
@KarolyHorvath這是不相干的 –
@KarolyHorvath,是的,這是無關緊要的。發佈的代碼很少,併產生錯誤。 –