考慮
#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.?
uj5u.com熱心網友回復:
這是因為當您呼叫 foo 時,編譯器需要推匯出 T 的型別。因為 A 和 A::Node 對于第一個 foo 都是有效的。而第二個 Foo 并不更具體。它將呼叫 foo 的第一個版本(將 T 替換為 A 和 A::Node)。要強制編譯器將 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/433979.html
