为什么这个"uint64_t"模板专用化与 Mac 平台上的"无符号长"不匹配?

Why this template specialization for `uint64_t` doesn't match with `unsigned long` on Mac platform?

本文关键字:平台 Mac 不匹配 无符号 专用 uint64 为什么      更新时间:2023-10-16

为什么使用clang 在MAC平台上遵循CODE代码摘要?sizeof unsigned longuint64_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...){}
};

祝你好运!