2016-05-04 30 views
0

我是新來的C++,並且正在使用模板。 我有一個可以獲得某種類型的函數。C++ - 嘗試使用模板時出現錯誤

頭:

template <typname T> 
response_t send_sequence_to_device(map<const string_t, T*> msg2device_p, 
    vector<response_t>& result_list, ushort num_attempts=SEND_NUM_ATTEMPTS); 

來源:

template <typname T> 
response_t send_sequence_to_device(map<const string_t, T*> msg2device_p, 
    vector<response_t>& result_list, ushort num_attempts) 
{ 
    bool is_ok_flag = true; 
    response_t r; 
    raftor1_logs_t* rlogs; 
    map<const string_t, T*>::iterator msg_it; 
    for(msg_it=msg2device_p.begin(); msg_it!=msg2device_p.end() and is_ok_flag; msg_it++) 
    { 
     r = msg_it->second->send(msg_it->first, true, num_attempts); 
     result_list.push_back(r); 
     is_ok_flag = is_ok_flag and is_ok(r); 

     if(not(is_ok_flag)) 
     { 
      stringstream ss; 
      ss << "ALERT: Sequence aborted due to error on message [" << msg_it->first << "] "; 
      if(r.erred()) 
       ss << "due to communication failure."; 
      else 
       ss << "with error message [" << r.msg << "]."; 
      rlogs->alert.begin_record(); 
      rlogs->alert.write(ss.str()); 
      rlogs->alert.end_record(); 
     } 
    } 

    if(is_ok_flag) 
     r.set_ok("ok.\n"); 

    return r; 
} 

我得到以下錯誤:

device_manager.cpp|1076|error: need 'typename' before 'std::map, T*>::iterator' because 'std::map, T*>' is a dependent scope

+1

假設從這個原型中可以看到足夠的類型定義,它看起來很好。請發佈產生此錯誤的完整代碼段。 – Quentin

+0

@ Quentin-這是標題中的相關代碼。你需要源代碼嗎? – Sarit8

+1

你有'模板'在源? – vu1p3n0x

回答

0

這裏:

map<const string_t, T*>::iterator msg_it; 

你需要這個:

typename map<const string_t, T*>::iterator msg_it; 
+0

我也可以閱讀錯誤:)但爲什麼我需要typename,爲什麼只在源代碼中? – Sarit8

+0

您需要'typename',因爲編譯器無法預先知道映射 :: iterator是一個類型還是一個值。 C++要求在這種情況下,編譯器應該假定它是一個值,除非你明確地說它是一個類型名。爲什麼在這種情況下,那是因爲它的形式爲klass :: type,其中T是封閉範圍中的模板參數。 –

+0

但爲什麼我不必寫也是在heder文件中? – Sarit8

相關問題