[英]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.