gpt4 book ai didi

c++ - 如何专门化模板成员函数?

转载 作者:太空狗 更新时间:2023-10-29 20:02:49 25 4
gpt4 key购买 nike

我有以下模板方法:

struct MyStruct
{
// ...
template<typename T>
void readField(std::istream& in, T& data)
{
read(in, data);
data = ntohl(data);
}
};

template<>
void MyStruct::readField<uint8_t>(std::istream& in, uint8_t& data)
{
read(in, data);
}

但是我遇到了那些奇怪的链接器错误:

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/exception:62: multiple definition of `void MyStruct::readField(std::basic_istream >&, unsigned char&)' ../Lib/obj/MyStruct.o:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/exception:62: first defined here collect2: ld returned 1 exit status make: *** [Lib] Error 1

如何特化这个成员函数?

编辑

这种方法有效:

struct MyStruct
{
// ...
template<typename T>
void readField(std::istream& in, T& data)
{
read(in, data);
data = ntohl(data);
}

void readField(std::istream& in, uint8_t& data)
{
read(in, data);
}
};

或使用 inline 或使用 inline 在类外专门化它

struct MyStruct
{
// ...
template<typename T>
void readField(std::istream& in, T& data)
{
read(in, data);
data = ntohl(data);
}
};

template<>
inline void MyStruct::readField<uint8_t>(std::istream& in, uint8_t& data)
{
read(in, data);
}

最佳答案

正如 Igor 提到的,您可以在头文件中实现通用版本,然后在 cpp 文件中实现特化,例如:

// MyStruct.h

struct MyStruct {
// ...
template <typename T>
void readField(std::istream& in, T& data) {
read(in, data);
data = ntohl(data);
}
};

然后在cpp文件中可以实现特化,例如:

// MyStruct.cpp

template <>
void MyStruct::readField<uint8_t>(std::istream& in, uint8_t& data) {
read(in, data);
}

更新:阅读评论后,特化也可以在与主模板相同的头文件中,但不在结构中,例如(我通过编译和运行类似示例验证没有错误):

// MyStruct.h

struct MyStruct {
// ...
template <typename T>
void readField(std::istream& in, T& data) {
read(in, data);
data = ntohl(data);
}
};

template <>
inline void MyStruct::readField<uint8_t>(std::istream& in, uint8_t& data) {
read(in, data);
}

// End MyStruct.h

关于c++ - 如何专门化模板成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35017335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com