未解决的模板化方法的专业化

时间:2018-03-18 07:27:55

标签: c++ templates unresolved-external

此代码无法解析void K::func<B>(B&)

struct K {
  template <typename T> void func(T &t);
};

struct B {
  void ok();
};

// definition
template <typename T> void K::func(T &t) { t->ok(); }

// getting: undefined reference to `void K::func<B>(B&)'
// nm says '                 U void K::func<B>(B&)'
template <> void K::func<B>(B &b);
template <> void K::func(B &b);

int main() {
  K k;
  B b;
  k.func(b);
};

注意:SO的其他几个问题与编译有关;一世 我坚持连接。请指出我是否重复。

更新: 我正在关注http://en.cppreference.com/w/cpp/language/template_specialization,寻找函数g1或g2;

UPDATE2:修复'func'到'K :: func'来修复'out of class member template definition',但K :: func仍然无法专门化。

2 个答案:

答案 0 :(得分:3)

您需要提供如下定义:

template <> void K::func<B>(B &b) {}

以下两个仅在第二种情况下是等效的,T是从参数类型推导出来的:

template <> void K::func<B>(B &b);
template <> void K::func(B &b);

答案 1 :(得分:0)

事实证明template <> void K::func(B &b);只是一个声明,因为需要定义template void K::func(B &b);。更新的代码:

struct K {
  template <typename T> void func(T &t);
};

struct B {
  void ok();
};

// definition
template <typename T> void K::func(T &t) { t.ok(); }
// specialiation: Do NOT put template <> here !!!    
template void K::func(B &b);

int main() {
  K k;
  B b;
  k.func(b);
};