簡體   English   中英

非模板結構/類的模板成員函數-默認類型是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM