C++ 错误:无法添加两个指针

C++ 错误:无法添加两个指针,c++,pointers,C++,Pointers,它在标题中给出了关于这段代码的错误: string DDateTime::date2OracleDate(DATE Date) { string s; s="TO_DATE('" + DateFormat("%d/%m/%Y",Date) + "','dd/MM/YYYY')"; return s; } 我不明白这是怎么可能的,没有任何指示 编辑: 您的文字字符串是char*。我不确定您的字符串是什么,但用构造的字符串替换每个带引号的字符串应该可以 s=string("

它在标题中给出了关于这段代码的错误:

string DDateTime::date2OracleDate(DATE Date)
{
    string s;
    s="TO_DATE('" + DateFormat("%d/%m/%Y",Date) + "','dd/MM/YYYY')";
    return s;
}
我不明白这是怎么可能的,没有任何指示

编辑:


您的文字字符串是
char*
。我不确定您的
字符串是什么,但用构造的
字符串替换每个带引号的字符串应该可以

s=string("TO_DATE('") + DateFormat("%d/%m/%Y",Date) + string("','dd/MM/YYYY')"); 
表示(对编译器而言)您正在添加一个
const char*
指针,该指针指向由
DateFormat
返回/转换的其他对象(可能是
char*
?),然后向其添加另一个
const char*
指针

尝试此操作可强制编译器为
运算符+
找到正确的
字符串
重载:

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

以下措施应能更好地发挥作用:

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

您尝试添加的三个字符串是C样式的字符串;每个都是指向字符串内容的指针。至少,我假设
DataFormat
返回一个C样式的字符串;这不是一个标准函数,所以我不知道它是做什么的

在C++中,你不能简单地“添加”这两个字符串来获得一个C++字符串,因为无法知道一个<代码> char */COD>实际上是一个字符串,或者是指向任意数据的指针。您必须将其中一个转换为
std::string
,然后才能“添加”C样式的字符串

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


问题只来自返回类型为char*-std::strings的DateFormat,通常可以与字符串文本连接,而不会出现任何问题

例如,以下工作:

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')";
    return std::string(sFormatted);
我们应该做到这一点

编辑1 看到DateFormat返回字符串,连接literal+std::string+literal应该没有问题。所以我被难住了

编辑2 Amardeep注意到DateFormat实际上返回了一个char*,尽管签名表明不是这样(很好)。我进行了测试,看起来确实没有出现错误或警告,即使在gcc上使用-Wall和-Wextra进行编译,函数的行为就像是定义char*

因此,出于最初的原因,我的解决方案应该仍然有效。(将字符串文字与std::string连接起来并没有实际问题,问题只是带有字符串文字的char*)

通过将sformated转换为std::string,这可能是一个更简洁的解决方案,可以修复问题的根源—DateFormat的错误返回类型

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

“TO_DATE('”是一个C字符串,不是STL字符串。我也要添加L"在前面?你的
string
类是从哪里来的?@Artelius:没有STL字符串。@Johannes:是的,问得好。键入
std::
有什么困难?只需键入五个字符。如果没有这些字符,几十人都在努力理解代码,那么键入这些字符又有什么用呢?只需要构建其中一个字符,因为运算符+的结果将是一个字符串,然后可以将其添加到另一个字符串中。另一方面,我不确定它是否已定义。也许是这样,但留下代码利用这一点会让以后的人一团糟。他们会将其拆分为两行或仅使用最后一半或其他内容,然后不理解为什么它不起作用他们甚至会问为什么第一个(或最后一个)是不同的,需要/不需要包装在构造函数中。明确你的意图可以以很低的成本构建一个更好的代码库-在两个位置键入8个字符比在哪个位置可以不键入它们更容易,这给未来的读者留下了一个谜。现在它失败的原因是什么?
string
似乎是一个类-为什么添加一个指针和一个类会导致关于添加两个指针的警告?我听不懂这个错误消息。@Johannes:运算符=()的关联性是从右到左的,而运算符+()的关联性是从左到右的。因此,在该行上执行的第一个操作是
“to_DATE('“+DateFormat())
没有定义运算符+()。仍然没有解释为什么它认为
DateFormat
返回指针。它不应该将字符串转换为指针(因为“指针+指针”没有内置的候选运算符)。但可能它确实转换了,因为不管怎样,当程序格式不正确时,它就不再重要了。我同意你的解释(我认为可能是这样),但我认为它应该是你答案的一部分。现在它是注释的一部分,我也很满意。@Johannes:hmm,
DateFormat()
函数原型返回字符串,但函数体返回一个
char*
,因此编译器必须从中创建一个临时字符串。RVO可能在这里踢进来了吗?顺便说一句,说得好——我应该在答案中包含解释。程序员可能很懒。。。
    return std::string(sFormatted);