必须以代码中描述的格式接收数据,但是问题在于字符串变量的操作。为避免错误该怎么办?
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
static struct ZZ {
const static int z1 = 1;
const static QString z2 = "word";
} z;
};
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
qDebug() << Class1::z.z2;
return a.exec();
}
错误:
class1.h:13: ошибка: in-class initialization of static data member 'const QString Class1::ZZ::z2' of non-literal type
const static QString z2 = "word";
^~
class1.h:13: ошибка: call to non-constexpr function 'QString::QString(const char*)'
const static QString z2 = "word";
^~~~~~
免责声明:
我的第一印象是,这个代码虐待class
和struct
什么namespace
实际上是发明了。
也就是说,答案集中static
在OPs代码中与数据成员有关的技术问题。
为了重现该问题,我制作了以下类似示例:
#include <iostream>
#include <string>
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
static struct ZZ {
static const int z1 = 1;
static const std::string z2 = "word";
} z;
};
int main(int argc, char* argv[])
{
std::cout << Class1::z.z2;
}
输出:
main.cpp:11:34: error: in-class initialization of static data member 'const string Class1::ZZ::z2' of non-literal type
11 | static const std::string z2 = "word";
| ^~
main.cpp:11:39: error: temporary of non-literal type 'const string' {aka 'const std::__cxx11::basic_string<char>'} in a constant expression
11 | static const std::string z2 = "word";
| ^~~~~~
恕我直言,这已经足够接近OP的问题。
TL; DR:问题在于static
成员变量必须明确定义(非内联)或标记为inline
。
因此,我的修复将如下所示:
#include <iostream>
#include <string>
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
inline static struct ZZ {
static const int z1 = 1;
inline static const std::string z2 = "word";
} z = ZZ{};
};
int main(int argc, char* argv[])
{
std::cout << Class1::x << '\n'
<< Class1::z.z1 << '\n'
<< Class1::z.z2 << '\n';
}
输出:
1
1
word
注意:
虽然inline
是必要的struct ZZ
和std::string
,它可以被排除在外的整数类型。因此,static const int z1 = 1;
将被接受而不会产生任何投诉(不带前缀inline
)。
进一步阅读:
cppreference.com上的静态数据成员
为了进行比较,相同的代码可以在没有inline
以下代码的情况下工作:
#include <iostream>
#include <string>
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
static struct ZZ {
static const int z1 = 1;
static const std::string z2;
} z;
};
//Class1::ZZ Class1::z;
const std::string Class1::ZZ::z2 = "word";
int main(int argc, char* argv[])
{
std::cout << Class1::x << '\n'
<< Class1::z.z1 << '\n'
<< Class1::z.z2 << '\n';
}
输出:
1
1
word
注意:
关于const Class1::ZZ Class1::z;
,我不太确定。缺少的定义可能会被遗漏,因为Class1::z
它从未使用过。
为了验证这一点,我再次修改了示例:
#include <iostream>
#include <string>
class Class1
{
public:
Class1() = delete ;
const static int x = 1;
static struct ZZ {
static const int z1 = 1;
static const std::string z2;
} z;
};
Class1::ZZ Class1::z;
const std::string Class1::ZZ::z2 = "word";
std::ostream& operator << (std::ostream &out, const Class1::ZZ &z)
{
return out << z.z1 << ", " << z.z2;
}
int main(int argc, char* argv[])
{
std::cout << Class1::x << '\n'
<< Class1::z << '\n'
<< Class1::z.z1 << '\n'
<< Class1::z.z2 << '\n';
}
输出:
1
1, word
1
word
注意:
注释Class1::z
(如前面的示例中)的定义会导致链接错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句