使用模板嵌套类型重载
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);
考虑
#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);