繁体   English   中英

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

[英]static data member defined in base class(template) but with type of derived class

我有一些这样的代码:

// 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)很好地编译,但是编辑器(不是IntelliSense编译器)在test()中的FooFactoryTable :: instance上报告错误:

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

如果我将实例的声明和定义更改为“ FactoryTable”类型(而不是TFactoryTable),则编辑器将不会报告错误。 所以我担心,这(编译得很好)是仅msvc的功能,还是标准的c ++功能? 因为该代码的目标平台是android和iphone,并且需要由gcc进行编译。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM