2013-10-02 3 views
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; 
} 

은 내가, 내가 그것의 정의 같은 방법을 사용하는 공장 용 테이블 (FooFactoryTable, BarFactoryTable, ...)를 강제 할 수 있도록이 FactoryTable <>에서 정적 멤버 "예"의 정의 넣어 하나씩 일어나는 것. 비주얼 스튜디오 2012 (V110)에 의해 잘 컴파일이 코드,하지만 편집기 (인텔리는 컴파일러되지 않음) (시험에 FooFactoryTable에 오류 :: 인스턴스를보고) :

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

내가 선언을 인스턴스의 & 정의를 변경하는 경우 "FactoryTable"유형 (TFactoryTable 아님) 일 경우, 편집기는 오류를보고하지 않습니다. 그래서,이 (잘 컴파일) msvc 전용 기능, 또는 표준 C++ 기능을 걱정입니까? 코드의 대상 플랫폼이 android와 iphone이기 때문에 gcc에서 컴파일해야합니다.

답변

1

Intellisense는 더 복잡한 구문 (특히 전처리 기나 템플릿)과 쉽게 혼동되어 가짜 오류를보고 싶어합니다. 이 같은. 정적 멤버 유형으로 TFactoryTable을 사용하는 코드는 100 % legal C++입니다.

+0

나는 두 개 이상의 컴파일 단위에 Foo.h가 포함되어 있다면'FooFactoryTable :: instance'에 대한 여러 정의가 있다는 링커 오류가 없습니까? 아니면 각 유닛에 대해 여러 개의 "개인"인스턴스를 사용하여 싱글 톤 사용을 없앨 것입니까? –

+0

@king_nak 정확히 하나의 인스턴스가있을 것이고 정의를 * 사용하는 모든 번역 단위에 * 반드시 * 있어야합니다. 컴파일러/링커가 작동하게해야합니다. – Angew

+0

좋아, 링커의 멋진 작품 ... 템플릿에 대한 정의가 모든 유닛에서 발생해야한다는 것을 알고 있지만, 정적에 대해서는이 방법으로 작동한다는 것을 알지 못합니다. 왜냐하면 템플릿이 없다면, 정적 인 인스턴스는 정확히 하나의 * 단위로 정의되어야합니다! –

관련 문제