Использование строковых переменных вместо строковых литералов приводит к ошибке

Я слежу за этим руководство отправить письмо на с ++. Вы можете скачать файлы заголовков: easendmailobj.tlh а также easendmail object в Вот

#include "stdafx.h"#include <iostream>
#include "easendmailobj.tlh"using namespace EASendMailObjLib;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
//string email = "[email protected]";

::CoInitialize( NULL );

IMailPtr oSmtp = NULL;
oSmtp.CreateInstance( "EASendMailObj.Mail");
oSmtp->LicenseCode = _T("TryIt");

// Set your gmail email address
oSmtp->FromAddr = _T("[email protected]");

// Add recipient email address
oSmtp->AddRecipientEx( _T("[email protected]"), 0 );

// Set email subject
oSmtp->Subject = _T("simple email from Visual C++ with gmail account");

// Set email body
oSmtp->BodyText = _T("this is a test email sent from Visual C++ project with Gmail");

// Gmail SMTP server address
oSmtp->ServerAddr = _T("smtp.gmail.com");

// If you want to use direct SSL 465 port,
// Please add this line, otherwise TLS will be used.
// oSmtp->ServerPort = 465;

// detect SSL/TLS automatically
oSmtp->SSL_init();

// Gmail user authentication should use your
// Gmail email address as the user name.
// For example: your email is "[email protected]", then the user should be "[email protected]"oSmtp->UserName = _T("[email protected]");
oSmtp->Password = _T("somepassword");

_tprintf(_T("Start to send email via gmail account ...\r\n" ));

if( oSmtp->SendMail() == 0 )
{
_tprintf( _T("email was sent successfully!\r\n"));
}
else
{
_tprintf( _T("failed to send email with the following error: %s\r\n"),
(const TCHAR*)oSmtp->GetLastErrDescription());
}

if( oSmtp != NULL )
oSmtp.Release();

int x;
cin>>x;

return 0;
}

Почему возникает ошибка, когда я пытаюсь использовать строковые переменные вместо «» ???

#include "stdafx.h"#include <iostream>
#include "easendmailobj.tlh"using namespace EASendMailObjLib;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string email = "[email protected]": //string variables

::CoInitialize( NULL );

IMailPtr oSmtp = NULL;
oSmtp.CreateInstance( "EASendMailObj.Mail");
oSmtp->LicenseCode = _T("TryIt");

// Set your gmail email address
oSmtp->FromAddr = _T(email); // string variable instead of "   " , error is here

// Add recipient email address
oSmtp->AddRecipientEx( _T("[email protected]"), 0 );

// Set email subject
oSmtp->Subject = _T("simple email from Visual C++ with gmail account");

// Set email body
oSmtp->BodyText = _T("this is a test email sent from Visual C++ project with Gmail");

// Gmail SMTP server address
oSmtp->ServerAddr = _T("smtp.gmail.com");

// If you want to use direct SSL 465 port,
// Please add this line, otherwise TLS will be used.
// oSmtp->ServerPort = 465;

// detect SSL/TLS automatically
oSmtp->SSL_init();

// Gmail user authentication should use your
// Gmail email address as the user name.
// For example: your email is "[email protected]", then the user should be "[email protected]"oSmtp->UserName = _T("[email protected]");
oSmtp->Password = _T("somepassword");

_tprintf(_T("Start to send email via gmail account ...\r\n" ));

if( oSmtp->SendMail() == 0 )
{
_tprintf( _T("email was sent successfully!\r\n"));
}
else
{
_tprintf( _T("failed to send email with the following error: %s\r\n"),
(const TCHAR*)oSmtp->GetLastErrDescription());
}

if( oSmtp != NULL )
oSmtp.Release();

int x;
cin>>x;

return 0;
}

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

Error C2065: 'Lemail' : undeclared identifier

2

Решение

Строковый литерал и std::string это две совершенно разные вещи. Обычно, когда функция f ожидает const char* Вы можете передать ему строковый литерал или использовать метод c_str() такой строки, как так f(email.c_str()),

Однако проблема здесь в том, что _T это не функция. Это макрос, и он просто добавляет L в качестве префикса к строковым литералам. Там нет никакого способа, которым вы можете использовать его для std::string, Вам нужно будет использовать некоторые функции для преобразования.

В качестве альтернативы определите макрос, который делает то же самое, что и _T и решает использовать wstring или же string в зависимости от того, если UNICODE определено. Попробуйте прочитать код и что делает _T делай, и ты должен понять, что я имею в виду.

2

Другие решения

Это зависит от того, UNICODE определено.

Если это так, используйте std::wstring вместо строки. Кроме того, удалите _T обёртывание строковой переменной и добавление .c_str()

1

Если это стандартный мусор Microsoft (точнее,
эксперимент, который не удался — то, чего они хотели достичь, это
похвально, но то, чем они на самом деле оказались, бесполезно
сложность), вам лучше всего избавиться от нее: функция
main (не _tmain), используйте char (или же wchar_t, в зависимости от
что хочешь, но должно быть char в декларации
main) вместо _TCHARи забыть о _T,

Что касается насущной проблемы, то _T это макрос, который будут
работать только со строковыми литералами; это так, как это было задумано.
Если вы используете его для чего-то другого, он может расшириться до чего-то вроде
Lemailчто, конечно, не будет известно.

1

недопустимое использование _T (); это для строковых литералов.

Так что эта линия должна быть;

oSmtp-> FromAddr = email.c_str ();

0

Это определение _T:

#if defined(_UNICODE)
#define _T(x) L ##x
#else
#define _T(x) x
#endif

Итак, как вы можете видеть, он просто добавляет L перед всем, что прошло внутри. Так что, если вы передаете строку, например, _T("HELLO WORLD") это будет переводиться на L"HELLO WORLD" если _UNICODE определено.

Точно так же, если вы передадите в любой другой токен, _T(email) например, это преобразовало бы это в Lemail вот почему вы получаете ошибку.

Обойти было бы использовать std::wstring а также std::string как:

#if defined(_UNICODE)
#define String std::wstring
#else
#define String std::string
#endif

и использовать String email вместо.

0
По вопросам рекламы [email protected]