小示例程序给了我一个错误
Small sample program gives me an error
我的示例程序太小了,我将在下面为您提供所有源代码:
所以这里是 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
以下是 A 类的源文件:
#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
最后,下面给出了 Class B 的唯一方法的定义:
#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);
}
main 函数几乎无关紧要,因为它完全是空的,与我从 Code::Block 得到的错误无关。错误给出如下:
||=== 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)) ===|
这一行:
static ClassA WHITE = ClassA(1,1,whitePixel);
需要一个复制构造函数才能工作。构造函数ClassA(ClassA&)
不匹配,因为临时变量无法绑定到左值引用。您可以改为使构造函数引用const
。
ClassA(ClassA const&);
这是有效的,因为临时(右值(可以绑定到const
的左值引用。
您正在做的是创建一个临时ClassA
值并从中复制构造WHITE
。这称为复制初始化。如果改用直接初始化:
static ClassA WHITE(1,1,whitePixel);
复制构造函数只是将参数的所有成员复制到正在创建的对象。您的代码有效地执行完全相同的操作。幸运的是,编译器默认会为你提供一个复制构造函数,所以你不需要自己制作一个。
static ClassA WHITE = ClassA(1,1,whitePixel);
这将构造一个临时ClassA
,然后从中复制构造WHITE
。该副本可能会通过优化而移除,但必须可行。
您应该直接声明WHITE
:
static ClassA WHITE(1, 1, whitePixel);
static ClassA WHITE = ClassA(1,1,whitePixel);
这是一个复制初始化,它在语义上首先创建右侧部分,然后通过调用复制构造函数初始化左侧部分(可以省略此调用,但复制构造函数仍然必须可用(。对于直接初始化,请将其重写为
static ClassA WHITE(1,1,whitePixel);
也就是说,复制构造函数仍然应该采用 const 引用,甚至删除,正如 0x499602D2 所建议的那样。
相关文章:
- 试图修复一个错误,该错误不会让我开始编程其余部分
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 零四元数和任何向量都不为零的特征积,这是一个错误吗?
- 处理程序的模块列表中有一个错误的模块"WebSocketModule"
- 在 C++ 中使用 "transform" 会给出一个错误,指出这未在作用域中声明
- 在Cython中使用C库时,我遇到了一个错误
- 我需要帮助创建一个评分系统,但它一直给我一个错误,注释掉的整数是给我带来麻烦的部分
- 我试图用c++编写递归fibonacci序列,但当我编译时,我遇到了一个错误
- 从system()调用G++会返回一个错误
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 我收到一个错误无效的操作数,类型为 const char [42] 和二进制"运算符+"的双倍数
- 使用声明:GCC 和 Clang 的另一个错误?
- 全球免费给出一个错误.调试器不解释
- 相对于继承的构造函数,gcc 编译器是否还有一个错误?
- 为什么直接传递"this"指针来存档是一个错误,而另一个相同类型的指针是可以的?
- 为什么第三板有一个错误
- 如何编写一个错误结构,该结构可以包含不同的强键枚举作为错误代码
- 使用本地类型声明的G lambda被使用但从未定义 - 确实是一个错误
- 我需要在 Android Studio 中构建 NDK. 但它返回一个错误