2014-07-02 521 views
2

我想將字符傳遞給期望字符串的參數。如何將字符傳遞給期望字符串的函數

void test(const string&); 

test('a'); // does not like 

error: invalid user-defined conversion from ‘char’ to ‘const string& {aka const std::basic_string<char>&}’

我知道我可以改變「爲」,但在我真正的代碼,它不是在這一點文字。

我怎樣才能方便地得到這個編譯?

回答

10

沒有從字符到字符串的隱式轉換。你必須使用適當的構造函數,它還有另外一個參數指定長度,使一個字符串:

test(std::string(1, 'a')); 

或者,因爲C++ 11,與初始化器列表

test({'a'});    // if there are no ambiguous overloads of "test" 
test(std::string{'a'}); // if you need to specify the type 
+0

我想會有警告,因爲通過引用給予臨時對象。 – Arkady

+1

@Arkady:不應該;通過(const)引用傳遞一個臨時對象是一件常見的事情,我從來沒有聽說過有關它的任何編譯器警告。 –

+0

怎麼樣'std :: string()+'a'',我剛想過? –

1

呃,可能是添加自己的超載

void test(char v) 
{ test(string(1, v)); } 

編輯: 我沒有提到列出的C++ 11的答案,並且我認爲你不能修改這些callites。如果是後者的話,你沒有C++ 11,然後創建一個宏/函數這個..

void to_string(char v) 
{ return string(1, v); } 

// Use 
test(to_string('c')); 

然後你可以處理所有的情況下(const char*char*等與to_string()重載)

+1

我不想這樣做每個函數採取一個字符串,我可能想傳遞一個字符! –

+0

有很多方法可以解決這個問題,但是你並沒有真正說明約束條件是什麼(例如,你可以修改callites,還是你有一個特定的接口你想堅持,你有c + + 11 - 其中一些答案假設等)如果你澄清,可能會有什麼可能是一個很好的解決方案的共識。 – Nim

3

你可以使用花bruckets如下面的例子:

#include <string> 
#include <iostream> 

void test(const std::string&) { std::cout << "test!" << std::endl; } 

int main() { 
    test({'a'}); 
} 

LIVE DEMO

2

釷聽起來像是消息超載的工作。

void test(const string&); 
void test(char); 

並在你的類實現。

void yourclass::test(const string& aString) 
{ 
... 
} 


void yourclass::test(char aChar) 
{ 
    ::test(std::string(1,aChar)); 
} 
+0

我不想這樣做每個函數接受一個字符串,我可能想要傳遞一個字符! –

+1

@NeilKirk然後不要這樣做!你不想這麼做(即使你沒有提到你的問題中的這些要求)並不會使答案失效。 – mah

+0

我確實提到了「方便」.. –

相關問題