【问题标题】:member template instanciation成员模板实例化
【发布时间】:2014-06-24 15:41:36
【问题描述】:

我有一堆类都继承自同一个基类。 我想在 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&lt;SomeClass&gt; 实例化 declare_type&lt;SomeClass&gt; 但它没有...... 请注意,如果我添加它确实有效:

template class declare_type<SomeClass>;

在这种情况下,我什至不需要 BaseClass 中的成员,但它的“魔力”要少得多,因为每个类都需要写一行来声明......

P.S:要清楚“它不起作用”意味着 ClassRegister::declare() 永远不会被调用,而不是“它起作用”意味着 ClassRegister::declare() 在 main 之前被调用,我可以使用 ClassRegistry正确。

P.S.2:OK:http://ideone.com/Af49Pb KO:http://ideone.com/ZMSSJW,唯一的区别是第 66 行

【问题讨论】:

  • 你说它“不起作用”,但实际上发生了什么?你有错误吗?哪个?发生了哪些意想不到的事情?
  • 不是一个解决方案,但如果你有一个使用强类型语言(如 C++)返回 void * 的“工厂”设计模式,你的设计中可能存在一些固有缺陷。
  • 我们渴望解开这个谜团。我们训练有素的猴子团队正在尽最大努力恢复您省略的所有代码,以实现零级中间目标:使该死的东西编译。预计交货日期在世界杯(希望是本届世界杯)结束之后的某个时间。
  • 哦,我明白了。您正在使用 Visual Studio。血腥的东西并不意味着可以用普通的编译器编译。我的错。

标签: c++ templates


【解决方案1】:

你显式地实例化了declare_type&lt;SomeClass&gt;,但这对declare_type&lt;SomeClass&gt;::n 毫无意义。它没有被使用,因此不会被实例化。

如果你希望它被实例化,你需要从非模板代码中直接或间接地使用它。

int doit = declare_type<SomeClass>::n;

(你当然需要公开n)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多