2014-02-07 50 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