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

标签 c++ templates member-functions template-function

我有以下模板方法:

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/

相关文章:

c++ - 在第二个模板(STL 容器)中使用模板参数

C++ 成员函数作为友元

c++ - 部分模板特化 - 成员特化

c++ - 改变产地? Win32?

c++ - 在 C++ 中使用 find 语句将罗马数字转换为数字

php - 侧边栏位置错误

wpf - 在 WPF 中优雅地覆盖 ComboBox 的 ToggleButton 样式

c++ - 类成员函数作为函数指针

c++ - 根据先前的模板参数为模板参数分配默认值

c++ vector/类/结构到简短的冗长代码