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编译。
我很好奇:如果Foo.h包含在1个以上的编译单元中,那么会不会出现链接器错误,指出有'FooFactoryTable :: instance'的多个定义?或者是否会为每个单元存在多个“私有”实例,湮没单身人士的使用? –
@king_nak只有一个实例,并且定义*必须*存在于每个使用它的翻译单元中。编译器/链接器必须使其工作。 – Angew
好的,链接器的工作很好......我知道模板的定义必须在每个单元中出现,但不知道它是以静态方式工作的。因为如果没有模板,那么静态实例必须在*完全一个*单元中定义! –