为什么这个"uint64_t"模板专用化与 Mac 平台上的"无符号长"不匹配?
Why this template specialization for `uint64_t` doesn't match with `unsigned long` on Mac platform?
为什么使用clang 在MAC平台上遵循CODE代码摘要?sizeof
unsigned long
和uint64_t
都是8,所以我认为它们是相同的类型。那么,为什么编译认为Serializer<unsigned long>
是抽象的?
因为我已经定义了Serializer<uint64_t>, Serializer<int64_t>, Serializer<uint32_t>, Serializer<int32_t>, Serializer<uint16_t>, Serializer<int16_t>, Serializer<uint8_t>, Serializer<int8_t>
,所以有任何方法可以解决此问题并避免定义更多类型Serializer<unsigned long>
?
以下是错误消息,clang 和G 都给出类似的结果:
示例.cpp:23:31:错误:变量类型'serializer'为 抽象类
Serializer<unsigned long> s; ^ example.cpp:6:25: note: unimplemented
"序列化器"中的纯虚拟方法'tostring'
virtual std::string ToString(const T* val) = 0; ^ 1 error generated.
#include <iostream>
#include <vector>
#include <algorithm>
template <typename T>
class Serializer {
virtual std::string ToString(const T* val) = 0;
};
template <>
class Serializer<uint64_t> {
public:
virtual std::string ToString(const int8_t* val) {
return "";
}
};
int main(int argc, const char *argv[])
{
// both of the size is 8 bytes
std::cout << " size of unsigned long:" << sizeof(unsigned long) << " sizeof uint64_t:" << sizeof(uint64_t);
// following compile error happen
Serializer<unsigned long> s; //<------- Error happen here
s.ToString(NULL);
return 0;
}
在讨论时,通过使用编译时误差方法,发现uint64_t
的类型为unsigned long long
而不是unsigned long
。尺寸相同,但他们的 name 是不同的,并且众所周知,编译器对名称 and and so -soy!
可以解决此问题,而无需更改库或更改用户界面!
只是标题之间的一些位置添加了以下内容:
template <>
class Serializer<unsigned long> : public Serializer<uint64_t>{};
或用户无法访问uint64_t
类型,更可能是:
template <>
class Serializer<unsigned long> : public Serializer<unsigned long long>{};
所以现在知道对于unsigned long
,专业化是(某些(与已经被育种的Serializer<uint64_t>
相同!
此外,根据Serializer
的定义,您可能还需要在其中添加一个构造函数:
template <>
class Serializer<unsigned long> : public Serializer<unsigned long long>{
Serializer(...DATA...):Serializer<unsigned long long>(...DATA...){}
};
如果您不知道什么是定义,这可能会有所帮助:
//for values
class Serializer<unsigned long> : public Serializer<unsigned long long>{
template<typename ... Ts>
Serializer(Ts ... Vs):Serializer<unsigned long long>(Vs...){}
};
//for objects
class Serializer<unsigned long> : public Serializer<unsigned long long>{
template<typename ... Ts>
Serializer(const Ts& ... Os):Serializer<unsigned long long>(Os...){}
};
祝你好运!
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- 有人安装"IITB Simplecpp in mac"吗?
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 在 Mac 上的 python 上提升
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- 如何在 Mac 上正确编译C++,当它在 Linux 上编译没有问题时?
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何在 MAC OS c/c++ 中阻止 USB 存储设备
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- Qt5 找不到 Mac OS X 的平台插件
- C++通用多平台解决方案来获取MAC地址
- Mac地址-C++-独立于平台
- 为何游戏开发者难以为PC、Mac和Linux平台编写游戏?