Ошибка: невозможно добавить два указателя - PullRequest
3 голосов
/ 24 июня 2010

выдает ошибку в заголовке об этом куске кода:

string DDateTime::date2OracleDate(DATE Date)
{
    string s;
    s="TO_DATE('" + DateFormat("%d/%m/%Y",Date) + "','dd/MM/YYYY')";
    return s;
}

Я не понимаю, как это возможно, без указателей ....

EDIT:

string DDateTime::DateFormat(string sFormat,DATE Date)
{
    struct tm tmTemp;
    RipOf_AfxTmFromOleDate(Date, tmTemp);
    RipOf_AfxTmConvertToStandardFormat(tmTemp);
    char sFormatted[MAX_TIME_BUFFER_SIZE];
    strftime(sFormatted, MAX_TIME_BUFFER_SIZE, sFormat.c_str(), &tmTemp);
    return sFormatted;
}

Ответы [ 5 ]

5 голосов
/ 24 июня 2010

Следующее должно работать лучше:

string DDateTime::date2OracleDate(DATE Date)
{
    string s = "TO_DATE('";
    s += DateFormat("%d/%m/%Y",Date);
    s += "','dd/MM/YYYY')";
    return s;
}
3 голосов
/ 24 июня 2010

Три строки, которые вы пытаетесь добавить, являются строками в стиле C; каждый является указателем на содержимое строки. По крайней мере, я предполагаю, что DataFormat возвращает строку в стиле C; это не стандартная функция, поэтому я не знаю, что она делает.

В C ++ вы не можете просто «сложить» два из них вместе, чтобы получить строку C ++, поскольку нет способа узнать, является ли char* строкой или указателем на произвольные данные. Вы должны конвертировать один из них в std::string, тогда вы можете «добавить» строки в стиле C к этому.

string s = "TO_DATE(";
s += DateFormat(whatever);
s += "','dd/MM/YYYY')";

или

string s = string("TO_DATE(") + DateFormat(whatever) + "','dd/MM/YYYY')";
2 голосов
/ 24 июня 2010

Проблема возникает только из возвращаемого типа DateFormat, представляющего собой char * - std :: strings обычно могут без проблем объединяться со строковыми литералами.

например. следующие работы:

std::string a, b;
b = "foo";
a = "literal" + b + "literal";

, но следующее не будет работать:

std::string a, b;
b = "foo";
a = "literal" + b.c_str() + "literal";

Единственное требуемое изменение должно заключаться в преобразовании результата из DateFormat в std :: string.

s="TO_DATE('" + std::string(DateFormat("%d/%m/%Y",Date)) + "','dd/MM/YYYY')";

Должен сделать свое дело.

Редактировать 1

Видя, что DateFormat возвращает строку, проблем с конкатенацией литерала + std :: string + literal не должно было возникнуть. Так что я в тупике.

Редактировать 2

После того, как Амардип заметил, что DateFormat на самом деле возвращает символ *, несмотря на подпись, указывающую на обратное (хороший улов). Я проверил, и это действительно кажется, что никаких ошибок или предупреждений не возникает, даже при компиляции с -Wall и -Wextra на gcc, функция ведет себя так, как если бы она просто защищала char *.

Так что мое решение должно работать по первоначальным причинам. (и нет реальной проблемы с конкатенацией строковых литералов с помощью std :: string, проблема только в char * со строковыми литералами).

Вероятно, было бы более точное решение для устранения корня проблемы - неверный тип возвращаемого значения DateFormat путем преобразования sFormatted в std :: string.

    return std::string(sFormatted);
2 голосов
/ 24 июня 2010

Ваши буквенные строки char*. Я не уверен, какой у вас string, но замена каждой строки в кавычках на составную string должна сделать это.

s=string("TO_DATE('") + DateFormat("%d/%m/%Y",Date) + string("','dd/MM/YYYY')"); 
1 голос
/ 24 июня 2010
s="TO_DATE('" + DateFormat("%d/%m/%Y",Date) + "','dd/MM/YYYY')";

означает (для компилятора), что вы добавляете указатель const char* к чему-то другому (возможно, char*?), Возвращенному / преобразованному из DateFormat, а затем добавляете к нему еще один const char*указатель.

Попробуйте, чтобы ваш компилятор нашел правильные string перегрузки для operator+:

s=string("TO_DATE('") + DateFormat("%d/%m/%Y",Date) + "','dd/MM/YYYY')";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...