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>
не связаны друг с другом - один не является базовым классом другого, и не имеет значения, какие функции и члены существуют в общем 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()
. То есть, пока кто-то идет дальше и добавляет:
template <>
class A<char> // no inheritance
{
// no h()
};
Компилятор верен. Вы можете поместить функцию 'h' в другое место, например. базовый класс. – interjay
@Eduard Rostomyan Как вы собираетесь называть это, если его не существует? –
@ VladfromMoscow, я хочу называть комод :: h(), я не знаю, как, если бы знал, что я скорее задаю этот вопрос. –