2017-02-17 18 views
2

如何修復using行?從類型包中解壓縮模板參數

test_temp.cpp:

#include <memory> 
template <typename A, typename B, template<typename> class C> 
class X {}; 

template <typename A1, typename B1, template<typename> class C1> 
class Type_bundle { 
public: 
    typedef A1 A; 
    typedef B1 B; 
    template<typename T> using C = C1<T>; 
}; 

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>; 


int main() { 
    typedef Type_bundle<int,float,std::allocator> Ttb; 
    X_b<Ttb> x; 
} 

從鐺++

test_temp.cpp:14:63: error: expected an identifier or template-id after '::' 
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>; 
                 ~~~~~^ 

錯誤爲什麼不工作的呢?

回答

3

當你寫:

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>; 
//            ~~~~~~~~~ 

這表明,接下來將是一個類型的名稱。但T_b::template C不是一個類型,它是一個模板,所以這個構造是無效的。如果繼續將參數傳遞到C(如typename T_b::template C<D>),則會使用該構造。在那裏,typenametemplate都是必需的。

你想要的恰恰是:

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, T_b::template C>; 

沒有typename

-1

這編譯:

#include <memory> 
template <typename A, typename B, template<typename> class C> 
class X {}; 

template <typename A1, typename B1, template<typename> class C1> 
class Type_bundle { 
public: 
    typedef A1 A; 
    typedef B1 B; 
    template<typename T> using C = C1<T>; 
}; 

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, 
       T_b::template C >; 
int main() { 
    typedef Type_bundle<int,float,std::allocator> Ttb; 
    X_b<Ttb> x; 
} 
+0

我不知道這是爲什麼起作用。但在嘗試'typename T','template'等不同組合後,我得到了這個。如果模板變得更復雜,那麼這種蠻力搜索就非常有趣。 –