클래스에 정적 조건을 테스트하는 도우미 구조를 작성하고 싶습니다. 조건이 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());
}
};
:
이이 오류가 발생합니다 :'./main.cpp:83:34를이 같은 것을 추가해야하고 작업을해야하므로
이 하나 없음 : error : 'cond <>''의 초기화를위한 일치하는 생성자가 없습니다. (Clang을 사용했지만 GCC에서도 작동하지 않습니다.) – Mense@Mense - "tail"클래스에는 생성자가 없으므로 정확합니다. 하나 추가해야합니다. 나는이 정보로 답을 편집했다. –
감사합니다. 지금 일합니다. – Mense