为什么构造函数中的Multi Args不能在linux下工作?

时间:2009-01-21 05:09:03

标签: c++ linux variadic-functions

对于我的异常类,我有一个具有多个参数(...)的构造函数,它在windows下工作正常,但是在linux下它编译得很好但是拒绝链接到它。

为什么这在linux下不起作用?

这是一个例子:

class gcException
{
public:
    gcException()
    {
        //code here
    }

    gcException(uint32 errId, const char* format = NULL, ...)
    {
        //code here
    }
}


enum
{
    ERR_BADCURLHANDLE,
};

修改

所以当我这样称呼时:

if(!m_pCurlHandle)
    throw gcException(ERR_BADCURLHANDLE);

我收到了这个编译错误:

error: no matching function for call to ‘gcException::gcException(gcException)’
candidates are: gcException::gcException(const gcException*)
                 gcException::gcException(gcException*)
                 gcException::gcException(gcException&)

3 个答案:

答案 0 :(得分:6)

问题是你的拷贝构造函数不接受你给throw的临时值。这是一个临时的,因此是一个左值。对非约束的引用,即gcException&不能绑定它。请阅读详细信息here

正如对该答案的评论所暗示的那样,微软编译器有一个错误,它使绑定引用指向非const对象接受rvalues。您应该将copy-constructor更改为:

gcException(gcException const& other) {
    // ...
}

使其成功。它说这个bug是在Visual C ++ 2005中修复的。所以你会遇到与该版本相同的问题。所以最好立即修复这个问题。

答案 1 :(得分:2)

它编译和链接就好了。我将测试代码扩展为完整的“程序”:

class gcException {
    public:
        gcException() { }
        gcException(int errId, const char* format, ...) { }
};
int main() { new gcException(1, "foo", "bar", "baz"); }

然后g++ -Wall test.cpp运行没有错误。根据{{​​1}},我有gcc版本4.3.2(Debian 4.3.2-1.1)。我的快速示例是否为您编译?

(您是否可能不小心编译 - 或链接 - 使用gcc而不是g ++?)

答案 2 :(得分:0)

好吧只是想通了,似乎代码块使用gcc而不是g ++来编译文件。