2013-07-10 176 views
2

採取以下代碼片段:模板向後兼容4.7

struct whatever {}; 

template < template <typename, typename> class FOX, typename bat> 
struct wulf {}; 

template <typename A, typename B, typename C = whatever> 
struct box; 

template <typename A, typename B> 
struct box<A, B, whatever> {}; 

template <typename A, typename B, typename C> 
struct box : wulf<box, C> {}; 

int main(void) 
{ 
return 0; 
} 

下GCC 4.7.2編譯時,它編譯下GCC 4.1.2罰款,但產生以下錯誤:

main.cpp:14:25 error: type/value mismatch at argument 1 in template parameter list for 'template<template<class,class> class FOX, class bat> struct wulf' 
main.cpp:14:25 error: expected a template of type 'template<class, class> FOX', got 'template<class A, class B, class C> struct box' 

這是與我似乎能夠重現此錯誤,我不知道發生了什麼的最小的示例代碼片段。爲什麼代碼被拒絕,是否有正確的方法來完成這將在兩個編譯?

+0

這段代碼不應該在gcc 4.1中編譯......'box'是一個帶有3個類型參數的模板,它不匹配'wulf'的第一個參數,它是一個具有2個參數的模板。模板模板參數通常很棘手。 –

回答

3

您的wulf類模板接受作爲其第一個模板template-argument的具有兩個類型參數的類模板。

在這裏,你正試圖以提供相應的參數,類模板(box),其採用類型參數:

template <typename A, typename B, typename C> 
struct box : wulf<box, C> {}; 
//    ^^^ 

這是非法的。如果爲box類模板的第三個類型參數指定了默認類型參數,則無關緊要:模板參數的類型和數量必須完全匹配。

要解決該問題,改變你的wulf類模板的定義如下:

template < template <typename, typename, typename> class FOX, typename bat> 
//          ^^^^^^^^ 
struct wulf {}; 

這裏是一個live example,顯示您的代碼與上面的固定編制。

+0

就像戴維上面指出的那樣,這是有道理的。我很好奇的是爲什麼這似乎編譯好與海灣合作委員會4.1 –

+0

@PalaceChan:我會說這是一個錯誤在gcc 4.1 –

+0

@PalaceChan:這是否回答你的問題? :) –

1

使用C++ 11,你可以通過改變wulf來解決這個問題:

template < template <typename...> class FOX, typename bat> 
struct wulf {}; 

雖然GCC 4.1將不會接受我怕......


一更招我有時用:添加一個包裝類box

struct whatever {}; 

template < template <typename,typename> class FOX, typename bat> 
struct wulf {}; 

template <typename A, typename B, typename C = whatever> 
struct box; 

template <typename A, typename B> 
struct box<A, B, whatever> {}; 

template <typename A, typename B> 
struct box2 : box<A, B> {}; 

template <typename A, typename B, typename C> 
struct box : wulf<box2, C> {}; 

int main(void) 
{ 
    return 0; 
} 

我不知道這(在wulf內丟失box的第三個參數)對您而言是一個問題,但我在過去的這種技術幫助下有一些用例。

+0

是的,我想過這個...但4.1不會採取這個 –

+0

@PalaceChan看到我的編輯另一個想法。 –

+0

啊謝謝。是的,我認爲我會發布當我發現它時我最終做了什麼(我現在不能這麼做) –