提问人:Luca 提问时间:8/29/2023 更新时间:9/1/2023 访问量:67
消除模板中同名嵌套类和成员函数的歧义
Disambiguate nested class and member function with same name in template
问:
请参阅示例:可在此处编译
// Example program
#include <iostream>
#include <string>
class Foo {
public:
class Nes{};
void Nes(){}
using Ptr = void(Nes::*)();
};
template<typename T> class Bar
{
public:
using Ptr = void(T::Nes::*)();
};
int main()
{
using F = void(Foo::Nes::*)();
F compiles;
Bar<Foo>::Ptr notCompiles;
std::cout << typeid(Foo).name();
}
如何告诉编译器 Nes 应该是类而不是方法?
答:
5赞
Ted Lyngmo
8/29/2023
#1
在这种情况下:
template<typename T> class Bar {
public:
using Ptr = typename T::Ptr;
};
如果没有类型定义:T
Ptr
template <typename T> class Bar {
public:
using TNes = class T::Nes;
using Ptr = void (TNes::*)();
};
评论
0赞
user17732522
8/29/2023
在浏览了标准之后,我认为没有任何有效的语法可以做到这一点。using TNes
0赞
Ted Lyngmo
8/29/2023
@user17732522 我自己在挠头:-)这看起来很奇怪,但我想不出任何绕过它的方法。
0赞
Luca
8/29/2023
我已经试过了。这是有道理的......但是:错误:typename 说明符使用 TNes = typename T::Nes 引用 'Foo' 中的非类型成员 'Nes';实际问题是成员函数 Nes()。
0赞
Ted Lyngmo
8/29/2023
@Luca 这是答案中的暂时错误。然后我把它改成了 只是为了把它改回 .class
typename
class
1赞
Luca
8/29/2023
哇。你让我度过了美好的一天,先生。class 关键字是关键!
评论
&