Clang 3.4.2编译报错:需用'template'关键字处理依赖模板名rebind
解决Clang 3.4.2中
salloc::rebind<char>::other的模板依赖名称错误 这个报错是Clang严格遵循C++标准里依赖名称解析规则导致的,我给你拆解清楚问题和修复方案:
问题根源
当salloc是一个依赖于模板参数的类型(比如你的代码里它应该是某个模板的参数,或是allocator模板的实例),编译器在模板实例化前,没办法确定salloc::rebind是一个模板成员还是普通成员变量。你直接写rebind<char>时,编译器会误把它当成普通成员的调用/访问,而非模板实例化,因此会要求你用template关键字明确它的模板属性。同时,rebind<char>::other是依赖类型,还需要typename关键字来告诉编译器这是一个类型名称,不是变量。
修复后的代码
把你的typedef行修改为:
typedef basic_string<char, std::char_traits<char>, typename salloc::template rebind<char>::other> shared_string;
关键修改点说明
typename:用来标记rebind<char>::other是一个依赖于模板参数的类型,避免编译器将它误解析成变量或成员函数。template:放在rebind前,明确告知编译器rebind是salloc的模板成员,这样rebind<char>才会被正确识别为模板实例化操作。
这种写法完全符合C++标准,虽然部分旧版编译器可能允许省略这些关键字,但Clang 3.4.2对标准遵循度较高,必须加上才能通过编译。
内容的提问来源于stack exchange,提问作者user997112
相关产品推荐
相关产品推荐

