2012-01-21 45 views
1

下面的代碼不能用gcc 4.7(20120114)進行編譯,但是可以用鏗鏘聲++ 3.0編譯。這是gcc,clang中的錯誤還是僅僅因爲我在C++ 11中不允許我做什麼?嵌套可變模板:gcc或clang中的錯誤?

template< typename... args > 
struct A { 
    template< typename head, typename... tags > 
    struct Inner : public Inner<tags...> { 
    }; 

    template< typename head > 
    struct Inner<head> { 
     // assume both args... and tags... must be used to 
     // calculate TYPE 
     typedef int TYPE; 
    }; 
}; 

template< typename... args > 
struct B : A<args...> { 
    template<typename... tags> 
    typename A<args...>::template Inner<tags...>::TYPE x() { 
     return 0; 
    } 
}; 

int main(int argc, const char *argv[]) { 
    B<int, int, int> b; 
    b.x<char, short, long, double>(); 

    return 0; 
} 

上面的代碼是什麼,我嘗試做一個很簡單的例子,但本質是,我既需要ARGS ...類型和標籤...類型來計算的返回類型功能。如何才能做到這一點?

回答

3

不知道,如果是GCC與否的一個bug,但是標準的解決方案,使其編譯海合會正在申報空可變參數版本,然後專門它:

template <typename... T> 
struct Inner; 
template <typename Head, typename... Rest> 
struct Inner<Head, Rest...> : public Inner<Rest...> { ... }; 

演示:http://ideone.com/MFKVY