c++ 非模板函数接受模板消歧器

k10s72fa  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(141)

这个代码

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。

8wtpewkr

8wtpewkr1#

[临时名称]/6:
以关键字template为前缀的名称后面应跟随一个模板参数列表或引用一个类模板或别名模板。
这里的名称为setNumber

  • 后面不跟模板参数列表;
  • 不引用类模板;
  • 不引用别名模板。

所以接受这种语法是错误的。

相关问题