【发布时间】:2018-02-16 14:10:28
【问题描述】:
根据[temp.deduct.guide/3]:
(...) 应在与 相应的类模板,对于成员类模板,使用 相同的访问。 (...)
但下面的示例似乎在 [gcc] 和 [clang] 中都无法编译。
#include <string>
template <class>
struct Foo {
template <class T>
struct Bar {
Bar(T) { }
};
Bar(char const*) -> Bar<std::string>;
};
int main() {
Foo<int>::Bar bar("abc");
static_cast<void>(bar);
}
嵌套模板类的推导指南的正确语法是什么?或者也许这个是正确的,但编译器还不支持?
类似的语法但没有嵌套类在 gcc 和 clang 中编译得很好:
#include <string>
template <class T>
struct Bar {
Bar(T) { }
};
Bar(char const*) -> Bar<std::string>;
int main() {
Bar bar("abc");
static_cast<void>(bar);
}
【问题讨论】:
-
在 GCC 中这是一个错误,因为它认为你声明了一个函数。
-
@Someprogrammerdude 我不确定它是否是正确的语法 - 标准中没有相应的示例,但它提到了这种情况......
-
如果父类没有被模板化,嵌套模板推导指南有效......
-
@AndyG 是的,语法似乎是正确的
标签: c++ templates c++17 template-argument-deduction