///////////////////////////////////////////////////////////////////////////////
// ClassTemplate.hpp
//#pragma once
#include <iostream>
template <typename T>
class ClassTemplate
{
public:
ClassTemplate()
{
std::cout << "ClassTemplate constructor" << std::endl;
}
void Test()
{
std::cout << "ClassTemplate Test" << std::endl;
}
};
///////////////////////////////////////////////////////////////////////////////
// a.hpp
//#pragma once
// declare that somewhere this will be defined
extern ClassTemplate<int> obj; // NOT constructed here!
class A
{
public:
A()
{
// use it
obj.Test();
}
};
///////////////////////////////////////////////////////////////////////////////
// a.cpp
//#include "ClassTemplate.hpp"
//#include "a.hpp"
// create object (point of instantiation)
ClassTemplate<int> obj;
int main( int argc, char ** argv )
{
A a; // construct A, which uses obj
}
///////////////////////////////////////////////////////////////////////////////
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBDbGFzc1RlbXBsYXRlLmhwcAoKLy8jcHJhZ21hIG9uY2UKCiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBDbGFzc1RlbXBsYXRlCnsKcHVibGljOgogICBDbGFzc1RlbXBsYXRlKCkKICAgewogICAgICBzdGQ6OmNvdXQgPDwgIkNsYXNzVGVtcGxhdGUgY29uc3RydWN0b3IiIDw8IHN0ZDo6ZW5kbDsKICAgfQoKICAgdm9pZCBUZXN0KCkKICAgewogICAgICBzdGQ6OmNvdXQgPDwgIkNsYXNzVGVtcGxhdGUgVGVzdCIgPDwgc3RkOjplbmRsOwogICB9Cn07CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIGEuaHBwCgovLyNwcmFnbWEgb25jZQoKLy8gZGVjbGFyZSB0aGF0IHNvbWV3aGVyZSB0aGlzIHdpbGwgYmUgZGVmaW5lZApleHRlcm4gQ2xhc3NUZW1wbGF0ZTxpbnQ+IG9iajsgLy8gTk9UIGNvbnN0cnVjdGVkIGhlcmUhCgpjbGFzcyBBCnsKICAgcHVibGljOgogICAgICBBKCkKICAgICAgewogICAgICAgICAvLyB1c2UgaXQKICAgICAgICAgb2JqLlRlc3QoKTsKICAgICAgfQp9OwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBhLmNwcAoKLy8jaW5jbHVkZSAiQ2xhc3NUZW1wbGF0ZS5ocHAiCi8vI2luY2x1ZGUgImEuaHBwIgoKLy8gY3JlYXRlIG9iamVjdCAocG9pbnQgb2YgaW5zdGFudGlhdGlvbikKQ2xhc3NUZW1wbGF0ZTxpbnQ+IG9iajsKCmludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKiBhcmd2ICkKewogICBBIGE7IC8vIGNvbnN0cnVjdCBBLCB3aGljaCB1c2VzIG9iagp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v