消除模板中同名嵌套类和成员函数的歧义

Disambiguate nested class and member function with same name in template

提问人:Luca 提问时间:8/29/2023 更新时间:9/1/2023 访问量:67

问:

请参阅示例:可在此处编译

// 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 应该是类而不是方法?

C++ C++11 模板

评论

0赞 Barmar 8/29/2023
不确定它是否对模板有帮助,但请参阅 stackoverflow.com/questions/22691821/...
0赞 Luca 8/29/2023
@Barmar 谢谢,已经检查过了。我尝试在模板中使用 typedefs 为嵌套类型别名,但没有运气。当前的回计划重命名 Nes(),但我会避免它。
0赞 Daniel 8/29/2023
您是否尝试删除 ?&
0赞 Luca 8/29/2023
@Daniel 您指的是成员函数指针引用吗?无耻的是的,在某个时候。问题是我无法正确声明成员函数指针。
0赞 Luca 8/29/2023
我在MSVC2015和链接的 cpp.sh 网站上发现了这种行为(不知道他们使用的是什么 GCC。GCC 5.4 和 GCC 7.1 编译没有问题。

答:

5赞 Ted Lyngmo 8/29/2023 #1

在这种情况下:

template<typename T> class Bar {
public:
    using Ptr = typename T::Ptr;
};

如果没有类型定义:TPtr

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 这是答案中的暂时错误。然后我把它改成了 只是为了把它改回 .classtypenameclass
1赞 Luca 8/29/2023
哇。你让我度过了美好的一天,先生。class 关键字是关键!