此代码无法解析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仍然无法专门化。
答案 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);
};