2014-11-20 118 views
0

我想写一个帮助器结构来测试类的静态条件。如果条件为真,则应该在堆中分配一个对象,并且指向该对象的指针应该返回到std :: vector。C++ variadic模板委托循环错误

这些对象的样子:

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)的权利?

回答

0

就让它类的一部分,你使用它,明确给予完整类型:

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()); 
    } 
}; 

在构造函数中的:后充分类型,正是因为它在的继承列表提供类 - cond<R...>

编辑: 至于错误,没有找到构造函数,请注意它是真的。这个类:

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

不具备的,所以你应该添加这样的事情,它应该工作:

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

    } 
}; 
+0

这导致了这个错误:'./main.cpp:83:34 :错误:没有匹配的构造函数用于初始化'cond <>''(使用Clang,但不能用于GCC) – Mense 2014-11-20 21:03:08

+0

@Mense - 这是正确的,因为“tail”类没有构造函数。你需要添加一个。我用这些信息编辑了答案。 – 2014-11-20 21:11:26

+0

谢谢;现在工作。 – Mense 2014-11-20 21:16:06