这个代码
template <typename U>
struct Bar{
void setNumber(int) {}
};
template <int N>
struct Asd : public Bar<Asd<N>>{
void doSomething();
};
template<int N>
inline void Asd<N>::doSomething() {
this->template setNumber(N);
}
int main() {
Asd<42> obj;
obj.doSomething();
}
被GCC接受(甚至13.1和trunk),但被clang(https://godbolt.org/z/xbs8GqG7h)拒绝。接受它似乎是错误的(setNumber
不是模板函数),所以我相信这是GCC中的一个bug。有人能引用章节和诗句来说明这一点吗?
我试着在GCC bugzilla中搜索“消歧义器”,但只得到了不相关的bug。
1条答案
按热度按时间8wtpewkr1#
[临时名称]/6:
以关键字
template
为前缀的名称后面应跟随一个模板参数列表或引用一个类模板或别名模板。这里的名称为
setNumber
所以接受这种语法是错误的。