Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 是编译器还是我:从由lambdas组成的可变模板继承_Templates_C++11_Lambda_Variadic_Visual Studio 2015 - Fatal编程技术网

Templates 是编译器还是我:从由lambdas组成的可变模板继承

Templates 是编译器还是我:从由lambdas组成的可变模板继承,templates,c++11,lambda,variadic,visual-studio-2015,Templates,C++11,Lambda,Variadic,Visual Studio 2015,我有一些代码在GCC下工作,但在VisualStudio2015下编译失败(我意识到它正在开发中,但我认为这个领域应该得到实现) 模板 类继承:公共T。。。 { 公众: 继承(T…T):T(T){} }; int main(){ 自动l1=[](){}; 自动l2=[](){}; 继承测试(l1,l2); 返回0; } 这就是代码片段的精髓所在。Visual Studio在inherit的构造函数上显示“语法错误:'type'”。然后,它描述了它是如何到达那里的,并以“您无法构造lambda的

我有一些代码在GCC下工作,但在VisualStudio2015下编译失败(我意识到它正在开发中,但我认为这个领域应该得到实现)

模板
类继承:公共T。。。
{
公众:
继承(T…T):T(T){}
};
int main(){
自动l1=[](){};
自动l2=[](){};
继承测试(l1,l2);
返回0;
}
这就是代码片段的精髓所在。Visual Studio在inherit的构造函数上显示“语法错误:'type'”。然后,它描述了它是如何到达那里的,并以“您无法构造lambda的实例”作为结束语

我的假设是T(T)的展开。。。未正确扩展。然而,我很可能把语法弄错了

编辑:对不起,问题是:我到底有没有错?如果是,正确的语法是什么

其他发现:与我收到的回复一致,这似乎是VisualStudio2015在这方面存在缺陷的一个问题。在测试中,它似乎是一个扩展,其中构造函数参数被传递给有问题的lambda基类。VS2015下的以下测试工作:

template< typename T1, typename T2, typename... T3 >
class inherit2 : public T3...
{
public:
  inherit2(T1 t1, T2 t2) : T1(t1), T2(t2) {}
};

int main() {
  auto l1 = []() {};
  auto l2 = []() {};
  inherit2<decltype(l1), decltype(l2), decltype(l1), decltype(l2)> test(l1, l2);
  return 0;
}
模板
类2:公共T3。。。
{
公众:
继承2(T1,T2):T1(T1),T2(T2){
};
int main(){
自动l1=[](){};
自动l2=[](){};
2个测试(l1,l2);
返回0;
}
是编译器。A,v。19.00.23106.0自2015年7月起,接受您的示例


也许大括号初始化语法
T{T}…
会有所帮助。不过,我找不到合适的在线编译器来尝试。

看起来不错,clang++也接受它。当您删除变量,但保留lambda时会发生什么情况?我认为在某些情况下,当您传递lambda时,VisualStudio会出现问题。您的代码自gcc 4.6和clang 3.1(都是从2012年初开始)以来一直受支持。VisualC++在这里运行了3年。在更多的混乱之后,似乎是T(T)。。。用于将参数传递给引起问题的基本构造函数的扩展。我将用这个发现编辑我的帖子,以防其他人在遇到同样的问题时偶然发现 C++中的语法,如果要生成一个“覆盖lambdas”的类型,则必须通过树或线性地继承。顺便说一句,您在“VS2015中的作品”示例中缺少了
:public T1、public T2
template< typename T1, typename T2, typename... T3 >
class inherit2 : public T3...
{
public:
  inherit2(T1 t1, T2 t2) : T1(t1), T2(t2) {}
};

int main() {
  auto l1 = []() {};
  auto l2 = []() {};
  inherit2<decltype(l1), decltype(l2), decltype(l1), decltype(l2)> test(l1, l2);
  return 0;
}