成员模板实例化

时间:2014-06-24 15:41:37

标签: c++ templates

我有一堆类都继承自同一个Base类。 我想在ClassRegistry中注册它们,ClassRegistry包含[name => factoryForThisClass]的地图。

要做到这一点,我有一个想法,但它不起作用,我不明白为什么:

#include <typeinfo>
#include <string>
#include <map>
#include <iostream>

template< typename T >
class declare_type
{
    static int n;
};


struct GenericClassFactory
{
    ~GenericClassFactory() {};
    virtual void* create( const std::string& rstrClassName ) = 0;
};

template <typename T>
struct ClassFactory : public GenericClassFactory
{
    virtual void* create( const std::string& rstrClassName )
    {
        return new T();
    }
};

class ClassRegister
{
public:
    virtual ~ClassRegister()
    {
    }

    template< typename T >
    static int declare( const std::string& rstrClassName = typeid(T).name() )
    {
        std::cout << "ClassRegister::declare( " << rstrClassName << " )\n";
        return 42;
    }

    static void create( const std::string& rstrClassName )
    {
        std::cout << "ClassRegister::create( " << rstrClassName << " )\n";
    }

private:
};

template< typename T >
int declare_type<T>::n = ClassRegister::declare<T>();


template< typename T > 
class BaseClass
{
    declare_type<T> m_declaration;
};

class SomeClass : public BaseClass<SomeClass>
{
public:
    void meow();
};

//template class declare_type<SomeClass>;

int main( void )
{
    ClassRegister::create( "9SomeClass" );

    return 0;
}

在我的理解中,让SomeClass继承BaseClass<SomeClass> instanciates declare_type<SomeClass>,但它不... 请注意,如果我添加:

,它确实有用
template class declare_type<SomeClass>;

在这种情况下,我甚至不需要BaseClass中的成员,但它不那么“神奇”,因为每个类都有一条这样的行要声明....

PS:要清楚“它不起作用”意味着从不调用ClassRegister :: declare(),而不是“它工作”意味着在main之前调用ClassRegister :: declare()并且我可以使用ClassRegistry正常。

P.S.2:好的:http://ideone.com/Af49Pb KO:http://ideone.com/ZMSSJW,只有差异是第66行

1 个答案:

答案 0 :(得分:0)

您明确地实例化了declare_type<SomeClass>,但这对declare_type<SomeClass>::n来说绝对没有任何意义。它没有被使用,因此不会被实例化。

如果您希望将其实例化,则需要直接或间接地使用非模板代码。

int doit = declare_type<SomeClass>::n;

(当然,你需要公开n。)