![](/img/trans.png)
[英]Templated member functions cannot call non-templated member function from same class, C++
[英]Templated member function of non-templated struct/class - what's the default type?
我看過這樣的代碼:
#include <iostream>
// member_function_templates.cpp
struct X
{
template <class T> void mf(T* t) {
std::cout << "in mf t is: " << *t << std::endl;
}
};
int main()
{
int i = 5;
X* x = new X();
x->mf(&i); //why can this be called without specifying a type as in: x->mf<int>(&i) ??
}
我的問題在主要評論中。 為什么要打電話給:
x->mf(&i);
...沒有指定類型? 直覺說應該這樣稱呼:
x->mf<int>(&i);
...但是顯然不必這樣調用(以上方法對我來說都是用gcc 4.7編譯的-帶有,而沒有明確指定模板。)
而且,如果您在未指定模板類型的情況下調用它,則T的類型將是什么(在模板函數定義中)? (我猜它默認為您傳遞給函數mf作為參數的類型,但是進一步解釋它的工作方式會很好)
那就是模板類型的推導,它適用於所有模板函數,而不僅僅是非模板類的成員。 基本上,編譯器能夠推斷(遵循標准中的一組規則)從參數到函數的類型T
含義。 當編譯器看到對mf(&i);
的調用時 ,它知道i
是一個int
,所以參數是一個int*
,這意味着您想要具有T==int
(*)的重載
如果要強制對模板進行特殊的設置,則仍可以提供一組特定的模板參數。 例如,如果您不希望模板的參數是推導的參數,而是可以從模板轉換的參數:
template<typename T>
void foo(T arg) {...}
int i = 10;
foo(i); // calls foo<int>(i)
foo<double>(i); // calls foo<double>(static_cast<double>(i))
(*)比這稍微復雜一點,因為可能存在多種T
類型,其參數將對其有效,但是該語言中的規則確定要推導出的特定T
在這種情況下,它是int
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.