template<typename T>
class C;
template<typename T>
class CBase
{
private:
int foo;
friend class C<T>;
};
template <typename T>
class C : public CBase<T>
{
using CBase<T>::foo;
public:
void access() { foo = 1; } // есть везде, кроме T = int
};
template <>
class C<int> : public CBase<int>
{
using CBase<int>::foo;
public:
void funct() { foo = 42; } // есть только для T = int
};
int main()
{
C<void> cv;
cv.access();
C<int> ci;
ci.funct();
return 0;
}
dGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgQzsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIENCYXNlCnsKcHJpdmF0ZToKICAgIGludCBmb287CiAgICBmcmllbmQgY2xhc3MgQzxUPjsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBDIDogcHVibGljIENCYXNlPFQ+CnsKICAgIHVzaW5nIENCYXNlPFQ+Ojpmb287CnB1YmxpYzoKICAgIHZvaWQgYWNjZXNzKCkgeyBmb28gPSAxOyB9IC8vINC10YHRgtGMINCy0LXQt9C00LUsINC60YDQvtC80LUgVCA9IGludAp9OwoKdGVtcGxhdGUgPD4KY2xhc3MgQzxpbnQ+IDogcHVibGljIENCYXNlPGludD4KewogICAgdXNpbmcgQ0Jhc2U8aW50Pjo6Zm9vOwpwdWJsaWM6CiAgICB2b2lkIGZ1bmN0KCkgeyBmb28gPSA0MjsgfSAvLyDQtdGB0YLRjCDRgtC+0LvRjNC60L4g0LTQu9GPIFQgPSBpbnQKfTsKCmludCBtYWluKCkKewogICAgQzx2b2lkPiBjdjsKICAgIGN2LmFjY2VzcygpOwogICAgQzxpbnQ+IGNpOwogICAgY2kuZnVuY3QoKTsKICAgIHJldHVybiAwOwp9