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
C++ 成员类模板的类模板参数推导_C++_Templates_C++17 - Fatal编程技术网

C++ 成员类模板的类模板参数推导

C++ 成员类模板的类模板参数推导,c++,templates,c++17,C++,Templates,C++17,考虑以下几点 template <typename T1> struct OuterFoo { template <typename T2> struct InnerFoo { InnerFoo(T2 v2) {} }; explicit OuterFoo(T1 v1) {} }; int main() { OuterFoo outer_foo{6}; OuterFoo<int>::InnerFoo inner_foo{3

考虑以下几点

template <typename T1>
struct OuterFoo {
  template <typename T2>
  struct InnerFoo  {
    InnerFoo(T2 v2) {}
  };

  explicit OuterFoo(T1 v1) {}
};

int main() {
  OuterFoo outer_foo{6};
  OuterFoo<int>::InnerFoo inner_foo{3};

  return 0;
}
模板
结构OuterFoo{
模板
结构InnerFoo{
InnerFoo(t2v2){}
};
显式OuterFoo(T1 v1){}
};
int main(){
外福外福{6};
OuterFoo::InnerFoo-inner_-foo{3};
返回0;
}

clang拒绝编译这篇文章,声称“没有可行的构造函数或演绎指南来演绎‘InnerFoo’的模板参数”——另一方面,Gcc编译时没有问题

所提供的示例是否正确(按照标准)使用CTAD,这里的clang是否有错

如果提供了扣减指南,clang可以编译,但gcc不接受该指南:

模板
结构OuterFoo{
模板
结构InnerFoo{
InnerFoo(t2v2){}
};
//clang 6中需要此模板扣减指南
//对于要编译的示例。
//GCC编译时没有此TDG,但报告错误
//用它
//“扣除指南'OuterFoo::InnerFoo(T2)->OuterFoo::InnerFoo'
//必须在命名空间范围中声明“
模板InnerFoo(t2v2)->InnerFoo;
//…但OuterFoo不需要TDG
显式OuterFoo(T1 v1){}
};
int main(){
外福外福{6};
OuterFoo::InnerFoo-inner_-foo{3};
返回0;
}
clang和gcc中成员模板类的CTAD状态如何?现在还没有吗

clang和gcc中成员模板类的CTAD状态如何?现在还没有吗

根据,CTAD可用于版本7和更高版本

根据,CTAD可用于版本7和更高版本


但是,请注意,在这些实现的后续版本中已经报告并解决了一些缺陷。

一个随机的问题:为什么人们仍然使用模板而不是
auto
template <typename T1>
struct OuterFoo {
  template <typename T2>
  struct InnerFoo  {
    InnerFoo(T2 v2) {}
  };

  // This Template Deduction Guide is required in clang 6
  // for the example to compile.
  // GCC compiles without this TDG but reports an error
  // with it
  // "deduction guide ‘OuterFoo<T1>::InnerFoo(T2) -> OuterFoo<T1>::InnerFoo<T2>’
  // must be declared at namespace scope"
  template<typename T2> InnerFoo(T2 v2) -> InnerFoo<T2>;

  // ...but no TDG is required for OuterFoo
  explicit OuterFoo(T1 v1) {}
};

int main() {
  OuterFoo outer_foo{6};
  OuterFoo<int>::InnerFoo inner_foo{3};

  return 0;
}