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

Luc*_*uca 4 c++ templates c++11

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

// 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();
}
Run Code Online (Sandbox Code Playgroud)

如何告诉编译器 Nes 应该是类而不是方法?

Ted*_*gmo 5

在这种情况下:

template<typename T> class Bar {
public:
    using Ptr = typename T::Ptr;
};
Run Code Online (Sandbox Code Playgroud)

如果T没有Ptr类型定义:

template <typename T> class Bar {
public:
    using TNes = class T::Nes;
    using Ptr = void (TNes::*)();
};
Run Code Online (Sandbox Code Playgroud)