의 유형이 같은 일부 코드 가지고정적 데이터베이스 클래스 (템플릿)에 정의 된 부재이지만 파생 클래스
// 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;
}
은 내가, 내가 그것의 정의 같은 방법을 사용하는 공장 용 테이블 (FooFactoryTable, BarFactoryTable, ...)를 강제 할 수 있도록이 FactoryTable <>에서 정적 멤버 "예"의 정의 넣어 하나씩 일어나는 것. 비주얼 스튜디오 2012 (V110)에 의해 잘 컴파일이 코드,하지만 편집기 (인텔리는 컴파일러되지 않음) (시험에 FooFactoryTable에 오류 :: 인스턴스를보고) :
Error: class "FooFactoryTable" has no member "instance"
내가 선언을 인스턴스의 & 정의를 변경하는 경우 "FactoryTable"유형 (TFactoryTable 아님) 일 경우, 편집기는 오류를보고하지 않습니다. 그래서,이 (잘 컴파일) msvc 전용 기능, 또는 표준 C++ 기능을 걱정입니까? 코드의 대상 플랫폼이 android와 iphone이기 때문에 gcc에서 컴파일해야합니다.
나는 두 개 이상의 컴파일 단위에 Foo.h가 포함되어 있다면'FooFactoryTable :: instance'에 대한 여러 정의가 있다는 링커 오류가 없습니까? 아니면 각 유닛에 대해 여러 개의 "개인"인스턴스를 사용하여 싱글 톤 사용을 없앨 것입니까? –
@king_nak 정확히 하나의 인스턴스가있을 것이고 정의를 * 사용하는 모든 번역 단위에 * 반드시 * 있어야합니다. 컴파일러/링커가 작동하게해야합니다. – Angew
좋아, 링커의 멋진 작품 ... 템플릿에 대한 정의가 모든 유닛에서 발생해야한다는 것을 알고 있지만, 정적에 대해서는이 방법으로 작동한다는 것을 알지 못합니다. 왜냐하면 템플릿이 없다면, 정적 인 인스턴스는 정확히 하나의 * 단위로 정의되어야합니다! –