小样本程序给我一个错误

时间:2014-12-21 19:52:25

标签: c++

我的示例程序非常小,我将为您提供以下所有源代码:

所以这是ClassA标题:

#ifndef CLASSA_H
#define CLASSA_H
#include <string>

class ClassA
{
public:
    ClassA(const std::string& fileName,  int TYPE = 0, float filter = 0.0f);
    ClassA(int width = 0, int height = 0, unsigned char* data = 0, int TYPE = 0, float   filter = 0.0f);
    ClassA(ClassA& classa);
    void operator=(ClassA& classa);
protected:

private:
    std::string m_lastBind;
    int m_textureTarget;
    bool m_freeTexture;
    int m_width;
    int m_height;
    float m_float;

};

#endif // CLASSA_H

以下是ClassA的源文件:

#include "classa.h"

ClassA::ClassA(const std::string& fileName, int TYPE, float filter)
{
    m_lastBind = fileName;
    m_textureTarget = TYPE;
    m_float = filter;
}


static unsigned char whitePixel[] = {'A', 'B', 'B', 'A'};

ClassA::ClassA(int width, int height, unsigned char* data, int TYPE, float filter)
{
    m_width = width;
    m_height = height;
    data = whitePixel;
    m_textureTarget = TYPE;
    m_float = filter;
}


ClassA::ClassA(ClassA& classa)
{
    m_width = classa.m_width;
    m_height = classa.m_height;
    m_textureTarget = classa.m_textureTarget;
    m_float = classa.m_float;
}

以下是ClassB的头文件:

#ifndef CLASSB_H
#define CLASSB_H
#include <string>

class ClassB
{
    public:
        void someMethod(const int& num1, const int& num2, std::string& name);
    protected:

    private:
};

#endif // CLASSB_H

最后,下面给出了ClassB唯一方法的定义:

#include "classb.h"
#include "classa.h"

static unsigned char whitePixel[] = {0xFF, 0xFF, 0xFF, 0xFF};
void ClassB::someMethod(const int& num1, const int& num2, std::string& name)
{
    static ClassA WHITE = ClassA(1,1,whitePixel);
}

主要功能几乎无关紧要,因为它完全是空的,与我从Code :: Blocks中获得的错误无关。错误如下:

||=== Build: Debug in Testing2 (compiler: GNU GCC Compiler) ===|
classb.cpp||In member function ‘void ClassB::someMethod(const int&, const int&, std::string&)’:|
classb.cpp|8|error: no matching function for call to ‘ClassA::ClassA(ClassA)’|
classb.cpp|8|note: candidates are:|
classa.h|10|note: ClassA::ClassA(ClassA&)|
classa.h|10|note:   no known conversion for argument 1 from ‘ClassA’ to ‘ClassA&’|
classa.h|9|note: ClassA::ClassA(int, int, unsigned char*, int, float)|
classa.h|9|note:   no known conversion for argument 1 from ‘ClassA’ to ‘int’|
classa.h|8|note: ClassA::ClassA(const string&, int, float)|
classa.h|8|note:   no known conversion for argument 1 from ‘ClassA’ to ‘const string& {aka const std::basic_string<char>&}’|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

3 个答案:

答案 0 :(得分:4)

这一行:

static ClassA WHITE = ClassA(1,1,whitePixel);

需要复制构造函数才能工作。构造函数ClassA(ClassA&)将不匹配,因为临时值不能绑定到左值引用。您可以让构造函数改为引用const

ClassA(ClassA const&);

这是有效的,因为临时值(rvalues)可以绑定到const的左值引用。


您正在做的是从中创建临时ClassA值和复制构建 WHITE。这称为复制初始化。如果您使用直接初始化

static ClassA WHITE(1,1,whitePixel);

复制构造函数只是将参数的所有成员复制到正在创建的对象中。您的代码有效地完成了同样的事情。幸运的是,默认情况下编译器会为您提供一个复制构造函数,因此您不需要自己制作

答案 1 :(得分:3)

static ClassA WHITE = ClassA(1,1,whitePixel);

这构造了一个临时的ClassA,然后从中复制构造WHITE。可以通过优化删除副本,但必须可以。

您应该直接声明WHITE

static ClassA WHITE(1, 1, whitePixel);

答案 2 :(得分:1)

static ClassA WHITE = ClassA(1,1,whitePixel);

这是一个复制初始化,它在语义上首先创建正确的部分,然后通过调用复制构造函数初始化左部分(此调用可能被省略,但复制构造函数仍然必须可用)。对于直接初始化,将其重写为

static ClassA WHITE(1,1,whitePixel);

也就是说,复制构造函数仍然应该使用const引用,甚至可以删除,如0x499602D2所示。