// 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编译。
答案 0 :(得分:1)
Intellisense很容易被更复杂的构造(特别是预处理器或模板)混淆,并喜欢报告虚假错误。像这个。使用TFactoryTable
作为静态成员类型的代码是100%合法C ++。