当我在Visual Studio中调试我的C++项目时,弹出一个警告对话框,告诉我:
A copy of datum.h was found in
c:/users/brad/desktop/source/binary/datum.h, but the current
source code is different from the version built into
c:/users/brad/desktop/source/binary/datum.h.
Run Code Online (Sandbox Code Playgroud)
我很难理解这甚至试图告诉我什么,更不用说如何解决它了.起初我以为可能会抱怨我不小心复制了目录中的一个文件,我查了一下这个文件,并没有发现任何类型,这让我很难过.我也尝试从解决方案中排除该文件并再次添加它,这也没有解决问题.
警告似乎并没有真正阻碍我的项目的发展,但我认为警告存在是有原因的,所以如果有人知道出了什么问题,任何建议都会非常感激.据我所知,我没有改变任何东西导致消息出现,它只是弹出一次我去调试解决方案并一直出现.
此外,相同警告的更多副本已经开始弹出,与我的解决方案中的其他头文件有关(我还没有收到任何有关.cpp文件的信息,但这可能是巧合,因为它只是持续大约20个分钟).
我最近一直在做一个项目,我决定将ReSharper C++安装到Visual Studio.当它分析我的代码时,它会吐出一堆新的警告(显然我的编码习惯很糟糕......).其中一个花了我一段时间才弄明白的是Binding r-value to l-value reference is non-standard Microsoft C++ extension.我用以下代码重新创建了警告:
Type foo(Type t1, Type t2) {
return Type(t1.value & t2.value);
}
Run Code Online (Sandbox Code Playgroud)
表达式t1.value & t2.value触发警告.我理解警告的第二部分,这意味着我的代码只是由于Microsoft扩展而编译,而其他编译器会拒绝编译它.我正在使用一个重载的运算符,它返回一个对象(称为Datum),Type它作为构造函数参数,作为引用(Type::Type(Datum& dat)).
随着一些游戏,我设法通过重构代码使警告消失:
Type bar(Type t1, Type t2) {
Datum datum = t1.value & t2.value;
return Type(datum);
}
Run Code Online (Sandbox Code Playgroud)
据我了解,这在功能上等同于生成警告的代码.我真正想知道的是这里是否有一些我应该注意的东西,因为我很困惑为什么一个函数会抱怨而另一个函数却没有.
我想我已经明白了.我已经把问题输出了,所以我要用我发现的内容发布它,以供其他人参考.我没有足够的知识去详细说明,所以如果不满意的话,请随意扩展或更正我的答案:)
C++/CLI有一个System :: Object类来实现这个目的,但我似乎无法在标准库中找到它.基本上我正在编写一组类,我希望基类std::string在content属性中存储向量,但派生类可能需要存储其他东西的向量(甚至可能是我自己的类之一).这似乎是一个奇怪的目标,但我正在写一些文件访问类,让我更容易操作不同格式的文件.基File类将每个行存储在一个字符串中,作为向量的一部分 - 但是,例如,JSON的类可能需要存储JS样式的集合/对象等.
我能想到的唯一方法就是让content属性成为对象的向量(或者其他一些通用的基类 - 我也可以从多态性中派生出任何自定义类),然后将其转换回任何类型的必要类型关于正在使用的子对象的类型.我很快就发现在任何std::object地方都找不到(或类似的).
这个例子应该展示我正在尝试做的事情:
class File {
protected:
std::vector<std::object> _content;
public:
//Contructors/methods/etc.
std::string getItemAt(size_t index) {
return static_cast<std::string>(this->_content[index]);
}
void setItemAt(size_t index, std::string value) {
this->_content[index] = static_cast<std::object>(value);
}
};
class JSONFile: File {
public:
//Constructors/methods/etc.
SomeObject getItemAt(size_t index) {
return static_cast<SomeObject>(this->_content[index]);
}
void setItemAt(size_t index, SomeObject value) {
this->_content[index] = static_cast<std::object>(value);
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,此示例假定std::object存在,并且这SomeObject将是用于处理JSON(例如,再次,例如,这可能是任何东西)数据的任何内容.SomeObject显然会来源于std::object.
任何建议将不胜感激,或者 …
我正在尝试编写一个函数,将一组字节重新解释为float.我已经看过一个Stackoverflow问题,它引导我尝试reinterpret_cast<>()一个字符数组,我开始尝试将一个浮点数拆分为chars然后再重新组装它,但这只给了我看似随机的数字,而不是我认为值应该是,因为每次输出都不同.一些不同的例子是:
1.58661e-038
3.63242e-038
2.53418e-038
Run Code Online (Sandbox Code Playgroud)
float变量应包含值5.2.
编译代码:
float f = 5.2;
unsigned char* bytes = reinterpret_cast<unsigned char*>(&f);
float f1 = reinterpret_cast<float&>(bytes);
std::cout << f1 << std::endl;
Run Code Online (Sandbox Code Playgroud)
给我
1.75384e-038
Run Code Online (Sandbox Code Playgroud)
当然,每次运行程序时都会有不同的数字.但有趣的是,如果我将代码放在一个循环中并在一次运行中执行几次,则输出保持一致.这导致我认为它可能是一个内存位置,但如果是这样,我不确定如何访问变量的实际值 - 解除引用操作符不起作用,因为它不是指针.
所以我的问题是 - 如何将类型的变量float(以及稍后的a double)拆分成单个字节(允许我修改位),然后重新组装它.
任何帮助将不胜感激.
c++ ×4
base-class ×1
c++11 ×1
casting ×1
lvalue ×1
oop ×1
polymorphism ×1
resharper ×1
rvalue ×1