2012-10-24 45 views
1

我跑的這兩行代碼添加到地圖以後:代碼檢測字符串和常量字符陣列

o.add("-i", 800,    "int option"); 
o.add("-w", "'switch on' option (no third parameter)"); 

要添加他們我在使用兩個附加的功能定義爲:

template<class T> 
void add(std::string name, T value, std::string desc); 
template<class T> 
void add(std::string name, std::string desc); 

第一個正常工作,並返回我想要的值,但如果我添加第二個,我得到的錯誤:

error: no matching function for call to ‘Opt::add(const char [3], const char [40])’ 

我闕這就是爲什麼它正確地使用我的字符串,而我的字符串被認爲是const char數組。

預先感謝您。

回答

1

既然你不使用你的第二個重載模板參數,將其刪除:

template<class T> 
void add(std::string name, T value, std::string desc); 

void add(std::string name, std::string desc); 

工作示例可以發現here

+0

非常感謝,由於某種原因,我以爲我後來在我的功能中使用T,但事實證明我不是。爲了教育的緣故,爲什麼會導致我的字符串被檢測爲char數組? – Classtronaut

+1

因爲他們*是* char數組。編譯器看到兩個'add'重載,一個帶有三個參數,另一個帶有非自動推導的模板參數。由於調用與任何一個重載都不匹配,因此它向您顯示了您嘗試調用該函數的實際類型。在C++中,與C#和Java不同,字符串文字具有char數組類型,而不是std :: string類型,儘管它們可以自動轉換爲std :: string,因爲std :: string有一個非顯式構造函數,它需要一個char陣列。 – user1610015

+0

@Classtronaut,是的,它顯示你傳入的類型。它仍然可以轉換爲不同的類型,就像第一個例子中發生的那樣。 – chris

1

錯誤消息是怪異,而是利用你需要明確指定模板參數(因爲沒有辦法自動推斷出這一點)第二個重載:

o.add<T>("-w", "'switch on' option (no third parameter)"); 

或者,如果你實際上並不在這種情況下需要模板參數,只是使其成爲非模板方法。