2013-10-02 48 views
1

的我有一些像这样的代码:静态数据成员但类型派生

// 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 <>的定义静态成员“实例”,这样,我可以迫使工厂表(FooFactoryTable,BarFactoryTable,...)使用相同的方式来定义它的单身。这些代码由Visual Studio 2012(V110)编译好,但编辑器(智能感知未编译器)测试报告FooFactoryTable错误::实例():

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

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

回答

1

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

+0

我很好奇:如果Foo.h包含在1个以上的编译单元中,那么会不会出现链接器错误,指出有'FooFactoryTable :: instance'的多个定义?或者是否会为每个单元存在多个“私有”实例,湮没单身人士的使用? –

+0

@king_nak只有一个实例,并且定义*必须*存在于每个使用它的翻译单元中。编译器/链接器必须使其工作。 – Angew

+0

好的,链接器的工作很好......我知道模板的定义必须在每个单元中出现,但不知道它是以静态方式工作的。因为如果没有模板,那么静态实例必须在*完全一个*单元中定义! –