如何正确使用嵌套结构体模板?解决MSVC编译错误问题
嵌套结构体模板的MSVC编译错误解决
问题代码
enum ByteOrder_e { MM, II, }; template<ByteOrder_e O> struct ByteOrder_s { enum Version_e { Small, Big }; template<Version_e V> struct Version_s { }; }; template<ByteOrder_e O, typename ByteOrder_s<O>::Version_e V> void Open() { using Version = typename ByteOrder_s<O>::Version_s<V>; // MSVC认为此行错误 }
编译错误信息
ConsoleApplication1.cpp(22,52): error C2760: 语法错误:此处意外出现“<”;应为“;”
ConsoleApplication1.cpp(22,55): error C2760: 语法错误:此处意外出现“;”;应为表达式
解决方法
问题核心是依赖类型的模板解析规则:ByteOrder_s<O>是依赖于模板参数O的类型,编译器在模板实例化前无法自动识别Version_s是嵌套模板还是普通成员,需要显式用template关键字声明。
修正后的代码:
template<ByteOrder_e O, typename ByteOrder_s<O>::Version_e V> void Open() { using Version = typename ByteOrder_s<O>::template Version_s<V>; }
关键说明
typename用于指明ByteOrder_s<O>::Version_e是一个类型(函数模板参数中已正确使用)- 在依赖类型中访问嵌套模板时,必须添加
template关键字,让编译器明确<是模板参数列表的起始符号,而非小于运算符。
内容的提问来源于stack exchange,提问作者埃博拉酱
相关产品推荐
相关产品推荐

