【发布时间】:2016-05-03 05:20:16
【问题描述】:
我有以下模板方法:
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: `void MyStruct::readField(std::basic_istream >&, unsigned 字符&)' ../Lib/obj/MyStruct.o:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/异常: 62: 首先在这里定义 collect2: ld 返回 1 退出状态 make: *** [Lib] 错误 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);
}
};
或使用inlines 或使用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);
}
【问题讨论】:
-
函数特化是常规函数,而不是模板。与任何其他函数一样,它必须在头文件中声明并在源文件中实现;否则,在头文件中实现但标记为
inline。 -
@IgorTandetnik 这种方法有效。您可以将其作为答案提交,我可以接受。虽然我可以在没有
inline的头文件中定义这个方法。为什么会这样? -
I can define this method in the header file without inline显然你不能,或者你不会在这里提问。尝试时会出现链接器错误,不是吗?也许我误解了你的意思。 -
@IgorTandetnik 好的,我的意思是我可以在没有
inline的类内部的头文件中定义方法(没有任何模板/专业化)。正如你提到的,我能做的是用inline专门化它,但仅限于类定义之外。非常感谢 -
成员函数的类内定义隐式为
inline。
标签: c++ templates member-functions template-function