2014-11-20 3 views
0

클래스에 정적 조건을 테스트하는 도우미 구조를 작성하고 싶습니다. 조건이 true이면 객체를 힙에 할당하고 객체에 대한 포인터를 std :: vector로 다시 작성해야합니다.C++ 가변 템플릿 위임 사이클 오류

그 객체는 다음과 같다 :

class BASE { 
    public: 
     virtual void func() = 0; 
}; 

class A : public BASE { 
    public: 
     const static int I = 0; 

     void func() { 
     std::cout << "CLASS A" << endl; 
     } 
}; 

class B : public BASE { 
    public: 
     const static int I = 1; 

     void func() { 
     std::cout << "CLASS B" << endl; 
     } 
}; 

체크 구조 :

template<class... R> 
struct cond {}; 

template<class T, class... R> 
struct cond<T, R...> : cond<R...> { 
    cond(vector<BASE *> &_b) : cond(_b) { 
     if(T::I == 1) 
     _b.emplace_back(new T()); 
    } 
}; 

그리고 어딘가에 주요 기능에 : 이론적으로

std::vector<BASE *> b; 
cond<A, B> t(b); 
for(auto *x : b) { 
    x->func(); 
} 

COND 구조에서 생성자해야 부모의 생성자를 호출하지만 C++ 11은 constru의 생성자를 호출하는 기능을 도입했습니다. ctors (위임). 그래서 컴파일러 솔기 나는이 오류의 결과로, 같은 클래스의 생성자를 호출 할 것인지 생각하는 :

단순히 전역 범위에 벡터를 이동 생성자 인수를 제거
./main.cpp:83:34: error: constructor for 'cond' creates a delegation cycle [-Wdelegating-ctor-cycles] 

가 작동하지만 나는 다른 prefere 것 해결책.

컴파일러에게 어떻게하면 cond (_b)를 적절히 삽입 할 수 있습니까? 그것이의 상속 목록에 제공되는 것과 똑같이, 전체 형식을 제공 생성자의 :

template<class... R> 
struct cond {}; 

template<class T, class... R> 
struct cond<T, R...> : cond<R...> { 
    cond(vector<BASE *> &_b) : cond<R...>(_b) { 
     if(T::I == 1) 
     _b.emplace_back(new T()); 
    } 
}; 

:

답변

0

그냥 완벽한 유형을 제공함으로써 클래스의 부분은 당신이 사용하고있는이 명시 적으로 만들 클래스 - cond<R...>

편집 : 오류에 대해서는 생성자가 없다는 것을 확인하십시오. 이 클래스 :

template<class... R> 
struct cond 
{ 
    template<typename...T> 
    cond(T...) 
    { 

    } 
}; 
+0

이이 오류가 발생합니다 :'./main.cpp:83:34를이 같은 것을 추가해야하고 작업을해야하므로

template<class... R> struct cond {}; 

이 하나 없음 : error : 'cond <>''의 초기화를위한 일치하는 생성자가 없습니다. (Clang을 사용했지만 GCC에서도 작동하지 않습니다.) – Mense

+0

@Mense - "tail"클래스에는 생성자가 없으므로 정확합니다. 하나 추가해야합니다. 나는이 정보로 답을 편집했다. –

+0

감사합니다. 지금 일합니다. – Mense