【发布时间】:2021-08-27 20:57:46
【问题描述】:
有一个模板声明
template<class C> struct Data {
template<typename T> struct Item1 {
void Test() {
}
};
};
使用带有编译选项 /std:c++latest 的 MSVC v19.28,我尝试按如下方式实例化模板:
template<class C> struct Data {
template<typename T> struct Item1 {
void Test() {
}
};
};
template <class C> struct MyData : Data<C> {
MyData::Item1<int> item10; // (1)
};
struct S;
MyData<S> dataS;
代码使用 MSVC 编译成功(参见link),但 gcc 11.1 和 clang 12.0.0 无法编译它(gcc 和 clang 的链接)
我尝试使用不同的声明来实例化模板
template <class C> struct MyData : Data<C> {
MyData::Item1<int> item10; // (1)
Data<C>::Item1<int> item11; // (2)
Data<C>::template Item1<int> item12; // (3)
};
MSVC 会编译所有这些,但 gcc 和 clang 不会。
我“找到”了一个solution,它可以与所有提到的编译器“工作”
template<typename C, typename T> struct Item2 {
void Test() {
}
};
template<class C> struct Data {
};
template <class C> struct MyData : Data<C> {
Item2<C, int> item20;
};
struct S;
MyData<S> dataS;
它使用一个独立的模板。
如何声明原始模板实例化符合C++标准? MSVC 编译所有 3 个选项的事实是它的缺陷吗?
【问题讨论】:
-
正确答案使用了一些非常时髦的语法:gcc.godbolt.org/z/MWMrdPjnd
-
@Frank,非常感谢。
标签: c++ templates language-lawyer