2011-06-07 33 views
2

我是C++的新手,我想知道爲什麼下面的行不正確。 (SERVER_NAME已被定義爲一個常量)文字和常量之間的C++連接

L"Initial Catalog=DatabaseName;Data Source=" << SERVER_NAME << ";" 

我得到這些錯誤:

error C2296: '<<' : illegal, left operand has type 'const wchar_t [...' 
error C2308: concatenating mismatched strings 

感謝

回答

6

操作< <不是一個連接運算符,這是一個特殊的重載運營商通過流類型讓你發送數據流。它只適用於使用流的情況。

您有兩種選擇。首先,你可以使用一個std :: wstring的:

std::wstring(L"Initial Catalog=DatabaseName;Data Source=") + SERVER_NAME + L";"; 

或者你可以使用一個wstringstream(從<sstream>頭):

std::wstringstream stream; 
stream << L"Initial Catalog=DatabaseName;Data Source=" << SERVER_NAME << L";" 

使用stream.str()得到在這種情況下產生的字符串。流式方法的優點是,即使並非所有要連接的東西都是字符串,也可以使用它。

如果您要打印到現有的流(如wcout),那麼您可以直接跳過字符串流並直接使用它。

正如其他答案指出的那樣,如果SERVER_NAME是一個帶有#define的常量創建,則可以使用L"Initial Catalog=DatabaseName;Data Source=" SERVER_NAME L";"。如果這是一個const wchar_t*,但它不起作用。

+0

招致運行時開銷剛粘上在編譯時已知的三個常量?不要這樣想。 – 2011-06-07 14:54:37

+0

儘管如此,'L'string1「CONSTANT L」string2「'方法只適用於常數是#define而不是實際的const。 – Sven 2011-06-07 14:59:00

+0

謝謝,它爲我工作,是的,常數是#define – 2011-06-07 15:09:46

1

它可能是SERVER_NAME不是一個寬字符的字符串。但是,最終破壞的是您的";"不是寬字符字符串。嘗試使用L";"

2

<<>>不是連接運算符,而是逐位移位運算符,這是完全不相關的。

這對初學者來說很讓人困惑,因爲它們已經超載了coutcin意思是完全不同的東西。

C和C++字符串字面的級聯沒有特殊的運營商完成的,因此只需要輸入:

L"Initial Catalog=DatabaseName;Data Source=" SERVER_NAME L";" 
0
std::wstring connectionString = "Initial Catalog=DatabaseName;Data Source="; 
connectionString += SERVER_NAME + ";"; 

確保SERVER_NAME被定義爲寬字符串,像這樣:

const wchar_t *SERVER_NAME = L"testdb"; 

或者,

std::wstring SERVER_NAME = L"testdb"; 
1

如果要連接這個字符串使用std :: stringstream的

std::stringstream ss; 
ss << "Initial Catalog=DatabaseName;Data Source=" << SERVER_NAME << ";"; 
std::string final = ss.str();