考虑这段代码。
template<class T>
class A
{
public:
void f(){..}
void h(){..}
};
template<>
class A<int>
{
public:
void f(){// something different..}
//void h(){..}
};
int main()
{
A<int> obj;
obj.h(); // I want to call A<T>::h(), but compiler erred that there is no h function in A<int>
}
有没有办法接听这个电话?还是一些解决方法?
答案 0 :(得分:3)
A<T>
是一个类模板,它根据任何类型名A
引入一系列类T
。 A<int>
是A<T>
的显式特化 - 它取代了泛型类定义。这与写完没有什么不同:
class Aint {
public:
void f();
};
此专业化只有一个成员函数 - f
。所以当你尝试这样做时:
A<int> obj;
obj.h();
由于A<int>
没有名为h
的成员函数,因此无法编译。尽管两者都被命名为A
,A<int>
和A<T>
不相关 - 一个不是另一个的基类,并且通用{{{ 1}} - A<T>
专业化没有它们。
如果A<int>
是常见的,您可以将其移动到基类中:
h
这样struct ABase { // or alternatively ABase<T>
void h();
}
template <typename T>
class A : ABase {
void f();
};
template <>
class A<int> : ABase {
void f();
};
的所有实例化都会有A
。也就是说,直到有人继续并添加:
h()
答案 1 :(得分:2)
根据您在专业化中更改的内容,您可能最好只为f
专门设置A<int>
而不是专门化整个班级:
template<class T>
class A
{
public:
void f(){cout << "standard";}
void h(){cout << "standard";}
};
template<>
void A<int>::f() {cout << "specialized";}
int main()
{
A<bool>{}.f(); //outputs standard
A<int> obj;
obj.f(); //outputs specialized
obj.h(); //outputs standard
}
如果您的专业化比这更复杂,您可以将常见行为纳入基类并从中派生A
。
答案 2 :(得分:2)
此代码适用于我:
template<class T>
class BaseA {
public:
void f(){...}
void h(){...}
};
template<class T>
class A : public BaseA<T>
{
};
template<>
class A<int> : public BaseA<int>
{
public:
void f(){...}
//void h(){..}
};
int main()
{
A<int> obj;
obj.h(); // I want to call A<T>::h(), but compiler erred that there is no h function in A<int>
}
它声明了一个由两者继承的基类。