C ++ конкатенация между литералом и константой - PullRequest
2 голосов
/ 07 июня 2011

Я новичок в C ++, и я хочу знать, почему строка ниже не является правильной.(SERVER_NAME определено как константа)

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

Я получаю следующие ошибки:

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

Спасибо

Ответы [ 5 ]

6 голосов
/ 07 июня 2011

operator << не является оператором конкатенации, это специальный перегруженный оператор по типам потоков, позволяющий отправлять данные в поток. Это работает только если вы используете поток. </p>

У вас есть два варианта здесь. Во-первых, вы можете использовать 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), вы можете просто пропустить поток строк и использовать его напрямую, конечно.

Как указали другие ответы, вы можете использовать L"Initial Catalog=DatabaseName;Data Source=" SERVER_NAME L";", если SERVER_NAME является константой create с #define. Если это const wchar_t*, это не сработает.

2 голосов
/ 07 июня 2011

<< и >> - это не операторы конкатенации, а скорее операторы побитового сдвига, что совершенно не связано.

Это сбивает с толку новичков, поскольку они были перегружены для cout и cinчто-то совсем другое.

Конкатенация строковых литералов в C и C ++ выполняется без специального оператора, поэтому просто наберите:

L"Initial Catalog=DatabaseName;Data Source=" SERVER_NAME L";"
1 голос
/ 07 июня 2011

Если вы хотите объединить эту строку, используйте std :: stringstream

std::stringstream ss;
ss << "Initial Catalog=DatabaseName;Data Source=" << SERVER_NAME << ";";
std::string final = ss.str();
1 голос
/ 07 июня 2011

Возможно, SERVER_NAME не является строкой широких символов.Однако определенно нарушается то, что ";" не является строкой с широкими символами.Попробуйте использовать L";"

0 голосов
/ 07 июня 2011
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";
...