1

我有一些这样的代码:

// 工厂.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 不是编译器)在测试()中的 FooFactoryTable::instance 上报告错误:

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

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

4

1 回答 1

1

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

于 2013-10-02T08:13:48.963 回答