亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當模板參數被用作另一個模板的參數時,為什么不能推導模板參數呢?

當模板參數被用作另一個模板的參數時,為什么不能推導模板參數呢?

C++
倚天杖 2019-07-03 16:34:45
當模板參數被用作另一個模板的參數時,為什么不能推導模板參數呢?這個代碼有什么問題?#include <map>template<typename T>struct TMap{     typedef std::map<T, T> Type;};template<typename T>T test(typename TMap <T>::Type &tmap_)      { return 0.0; }int _tmain(int argc, _TCHAR* argv[]){     TMap<double>::Type tmap;     tmap[1.1] = 5.2;     double d = test(tmap); //Error: could not deduce template argument for T     return 0;}
查看完整描述

3 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

這是不可還原的上下文。這就是為什么編譯器不能推導模板參數的原因。

想象一下如果你有專門的TMap詳情如下:

template <>struct TMap<SomeType>{
    typedef std::map <double, double> Type;};

編譯器將如何推斷類型SomeType,考慮到TMap<SomeType>::Typestd::map<double, double>?它不能。它是保證類型你用在std::map這個類型在……里面TMap..編譯器不能做出這種危險的假設。之間可能沒有任何關系。類型爭論,不管是什么。

另外,您可能有另一個專門化的TMap定義為:

template <>struct TMap<OtherType>{
    typedef std::map <double, double> Type;};

這使情況更加惡化?,F在你有了以下幾點:

  • TMap<SomeType>::Type = std::map<double, double>.

  • TMap<OtherType>::Type = std::map<double, double>.

現在捫心自問:給予TMap<T>::Typestd::map<double, double>,編譯器如何知道TSomeTypeOtherType?它甚至不知道多少它有這樣的選擇,也不知道選擇他們自己.。

我只是為了思考實驗而問你(假設它能知道一套完整的.選擇).


查看完整回答
反對 回復 2019-07-03
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

編譯器錯誤消息的確切內容是:TMap<T>::TypeT是不能按照標準演繹的。這樣做的原因可能是技術上不可能實現:編譯器必須實例化所有可能的TMap<T>以查看是否有一個(且只有一個)匹配您傳遞的類型。有一個無窮多的TMap<T>.


查看完整回答
反對 回復 2019-07-03
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

就連你也有:

TMap<SomeType>::Type = std::map<double, double>.

但在調用test(TMap)之前

TMap<double>::Type tmap;tmap[1.1] = 5.2;double d = test(tmap);

你已經把它聲明為

TMap<double>::Type tmap;

為什么不能利用這些信息。#ty對聯不只是簡單的字符串替換。


查看完整回答
反對 回復 2019-07-03
  • 3 回答
  • 0 關注
  • 601 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號