将模板模板参数与默认参数匹配

时间:2018-09-22 19:42:21

标签: c++ templates c++17

此问题与this one有关,并且必须与以下特定情况有关

List<String> list= new Gson().fromJson(idSet, new TypeToken<ArrayList<String>>(){}.getType());

OLEObject ole_wsh string ls_values, ls_message ole_wsh = CREATE OLEObject ole_wsh.ConnectToNewObject("MSScriptControl.ScriptControl") ole_wsh.Language = "vbscript" ole_wsh.AddCode('Function retDrives()~r~n' & + 'Set fso = CreateObject("Scripting.fileSystemObject")~r~n' & + 'drivesVolume = ""~r~n' & + 'For Each str In fso.Drives ~r~n' & + ' If str.IsReady Then ~r~n' & + ' drivesVolume = drivesVolume + "[" + str.VolumeName + "]" ~r~n' & + ' End If ~r~n' & + 'Next~r~n' & + 'retDrives=drivesVolume~r~n' & + 'End Function') ls_values = ole_wsh.Eval("retDrives") ole_wsh.DisconnectObject() DESTROY ole_wsh ls_message = "VOLUMES(s): " + ls_values MessageBox("DRIVES",ls_message) 中的标准已将这两种情况标记为“ OK”,但是defect CWG 150的最新更新是template<class T, class U = T> class B { }; template <class ... Types> class C { }; template<template<class> class P> class X { }; X<B>{ }; // OK X<C>{ }; // OK 决定不采取任何措施。 [temp.arg.template]/3CWG都不接受代码。

clanggcc是否不符合规定?

1 个答案:

答案 0 :(得分:2)

gcc从7.1开始接受。除非提供新的标志,否则clang intentionally不接受它:

  

尽管是缺陷报告的解决方案,但是默认情况下,所有语言版本均禁用此功能,并且可以在Clang 4及更高版本中使用标记-frelaxed-template-template-args明确启用此功能。对标准的更改缺少模板部分排序的相应更改,从而导致合理且先前有效的代码存在歧义错误。该问题有望很快得到解决。

有关上述中断代码的示例,请参见this question

Compilation demo


有关该核心问题的最新更新是:

  

[在论文P0522R0上于2016年11月的会议上转至DR,]

这只是问题的顶部,而不是底部。我添加了链接。