使用模板嵌套类型重载

Overloading with template nested type

考虑

#include <iostream>

template <typename T>
void foo (T*) { std::cout << "foo (T*) called.\n"; }

template <typename T>
void foo (typename T::Node*) { std::cout << "foo (typename T::Node*) called.\n"; }

struct A { 
    struct Node { };
};

int main() {
    A* a = new A;
    foo(a);
    A::Node* node = new A::Node;
    foo(node); 
}

Output:
foo (T*) called.
foo (T*) called.

如何修正代码,以便第二个输出给出 foo (typename T::Node*) called.

这是因为当您调用 foo 时,编译器需要推导 T 的类型。因为 A 和 A::Node 都对第一个 foo 有效。第二个 Foo 不是更具体。它将调用 foo 的第一个版本(用 A 和 A::Node 替换 T)。要强制编译器将 T 替换为 A 然后查看 T::Node*,您可以指定模板参数应该是什么。

foo<A>(node);

查看编译器对其类型使用什么的快速方法是使用 __PRETTY_FUNCTION__ 宏。哪个会输出:

foo (T*) called. sig: void foo(T *) [T = A]
foo (T*) called. sig: void foo(T *) [T = A::Node]

对于原始代码和

foo (typename T::Node*) called. sig: void foo(typename T::Node *) [T = A]

对于foo<A>(node);

https://godbolt.org/z/4xb45svYW