代码:
template<class T>
struct A {
void f1() {};
void f2() {};
};
template<>
struct A<int> {
void f2() {};
};
int main() {
A<int> data;
data.f1();
data.f2();
};
test.cpp: In function 'int main()':
test.cpp:16: error: 'struct A<int>' has no member named 'f1'
基本上,我只想专门化一个函数并使用其他函数的通用定义。 (在实际代码中,我有许多我不想专门研究的函数。)
怎么做?谢谢!
答案 0 :(得分:10)
考虑将公共部分移动到基类:
template <typename T>
struct ABase
{
void f1();
};
template <typename T>
struct A : ABase<T>
{
void f2();
}
template <>
struct A<int> : ABase<int>
{
void f2();
};
您甚至可以在派生类中覆盖f1
。如果您想要做一些更有趣的事情(包括能够从基类中的f2
代码中调用f1
),请查看CRTP。
答案 1 :(得分:8)
这会有所帮助:
template<typename T>
struct A
{
void f1()
{
// generic implementation of f1
}
void f2()
{
// generic implementation of f2
}
};
template<>
void A<int>::f2()
{
// specific implementation of f2
}
答案 2 :(得分:2)
当我们声明模板类的特化时,我们还必须定义它的所有成员,甚至是那些与通用模板类完全相同的成员,因为从通用模板到成员的成员没有继承专业化。因此,在您的专业化中,您还必须实施void f1();
。