静态数据成员,在基类(模板)中定义,但具有派生类的类型

时间:2013-10-02 08:07:04

标签: c++ templates

我有一些像这样的代码:

// Factory.h

template <typename TFactoryTable, typename TBaseProduct>
class FactoryTable {
public:
    static TFactoryTable instance;
};

template <typename TFactoryTable, typename TBaseProduct>
TFactoryTable FactoryTable<TFactoryTable, TBaseProduct>::instance;

// Foo.h

class BaseFoo {};
class FooFactoryTable : public FactoryTable<FooFactoryTable, BaseFoo> {};

// Bar.h

class BaseBar {};
class BarFactoryTable : public FactoryTable<BarFactoryTable, BaseBar> {};

// main.cpp

void test() {
    auto& t = FooFactoryTable::instance;
}

我在FactoryTable&lt;&gt;中放置了静态成员“instance”的定义,因此,我可以强制工厂表(FooFactoryTable,BarFactoryTable,...)使用相同的方式来定义它的单例。这些代码由visual studio 2012(v110)很好地编译,但编辑器(IntelliSense而不是编译器)在test()中报告FooFactoryTable :: instance上的错误:

Error: class "FooFactoryTable" has no member "instance"

如果我改变声明&amp;实例的定义是“FactoryTable”类型(不是TFactoryTable),然后编辑器不会报告错误。所以我担心,这是(编译好)一个msvc唯一功能,还是标准的c ++功能?因为代码的目标平台是android和iphone,需要通过gcc编译。

1 个答案:

答案 0 :(得分:1)

Intellisense很容易被更复杂的构造(特别是预处理器或模板)混淆,并喜欢报告虚假错误。像这个。使用TFactoryTable作为静态成员类型的代码是100%合法C ++。