2014-02-07 86 views
2

這跟在yesterday's question之後,我給了一些Visual Studio 2013無法處理的C++代碼,並且@ galop1n提供了一種解決方法,該解決方案對於這種情況非常合適。但是現在我已經走得更遠了,Visual Studio再次讓我感到悲傷。更多依賴類型與可變參數模板

template <typename T> 
using ValueType = typename T::value_type; 

template<typename... Containers> 
void 
foo(const Containers &...args) { 
    std::tuple<ValueType<Containers>...> x; 
} 

template<typename... Containers> 
struct Foo { 
    std::tuple<ValueType<Containers>...> x; 
}; 

每當我嘗試實例或者函數模板FOO或類模板富,我得到這兩個消息:

Test.cpp的(21):錯誤C3546: '...':有可用來擴大

Test.cpp的(21)無參數包:錯誤C3203: '值類型':unspecia lized別名模板不能被用作模板參數「_types」模板參數,預期一個實數型

在每種情況下(實例FOO或實例化的Foo),這兩個消息指向限定「X線」。

更新:我的Microsoft bug report現在有(在其附件中)此問題的所有基本變體。所以這將是一個觀看修復的地方。

+0

人,你只是在吸地,再一次,*雙向*工作在我的Mac鐺完美無瑕(鐺-500.2.79 )(基於LLVM 3.3svn)。啊。我沒有VS2013啓動並運行,因此請保存一些輸入內容並告訴我,VS2013是否支持模板參數?如果是這樣,可能會有另一種解決方法(至少從我這裏,其他人可能也有其他想法)。編輯:從頭開始,不會如何工作。呸。 – WhozCraig

+0

也許可以使用經典的元函數而不是類型別名。 'template struct value_type {typedef typename T :: value_type type; };' – pmr

+0

@pmr,您可以在模板類中使用typedef來定義「type」,這與容器定義「value_type」的方式相同;所以應用程序代碼訪問你的「類型」的問題基本上是同樣的問題,對吧? – slyqualin

回答

0

在VS2013或許以下工作(更詳細:/):

template<typename... Containers> 
void foo(const Containers &...args) { 
    std::tuple<typename std::decay<decltype(*args.begin())>::type...> x; 
} 

template<typename... Containers> 
struct Foo { 
    std::tuple<typename std::decay<decltype(*std::declval<Containers>().begin())>::type...> x; 
}; 
+0

感謝您的嘗試,但是您看到這一點,就像@ pmr的解決方案一樣,重複了我在[首次發佈]中引起爭議的成語(http://stackoverflow.com/questions/21607167/dependent-types-with-variadic-模板),即它使用形式'std :: tuple '的表達式。如果VS2013表現不佳,那麼我很快就會成爲一個快樂的人。 :) – slyqualin

+0

順便說一句,冗長並不讓我擔心,考慮到我迄今爲止最好的解決方法是重複我的模板1個參數,2個參數,3個參數和4個參數。 – slyqualin