【发布时间】:2016-07-04 21:34:03
【问题描述】:
#include <stdlib.h>
#include <stdint.h>
#include <vector>
struct MyClass1 {
virtual ~MyClass1() = default;
};
template <typename T>
struct MyClass2 : public MyClass1 {};
template <class...C> class MyClass3 { //will be singleton class
public:
MyClass3()
{
make_classes<C...>(_class_vec);
}
private:
static const size_t _num_classes = sizeof...(C);
static uint8_t *_buf[_num_classes];
std::vector<MyClass1*> _class_vec;
void make_classes(std::vector<MyClass1*> &vec) {}
template <class First, class... Rest> void make_classes(std::vector<MyClass1*> &vec) {
static size_t count;
First* tmp = new (_buf[count++]) First;
vec.push_back(tmp);
make_classes<Rest...>(vec);
}
};
int main() {
auto foo = MyClass3<MyClass2<int>, MyClass2<char>>();
return 0;
}
我正在尝试将一组可变参数模板参数传递给 Class3 的构造函数,并使用placement new 将它们放入适当大小的池的单元格中,该池的第一个维度是在编译时计算的。然后用基对象的类型构造一个指向它们的指针向量(传递到 Class3 模板的派生对象使用单个变量类型进行模板化。)
这编译正常,但是当我在 main 中创建 Class3 类型的对象时,我收到以下错误:
prog.cpp: In instantiation of 'void MyClass3<C>::make_classes(std::vector<MyClass1*>&) [with First = MyClass2<char>; Rest = {}; C = {MyClass2<int>, MyClass2<char>}]':
prog.cpp:32:29: required from 'void MyClass3<C>::make_classes(std::vector<MyClass1*>&) [with First = MyClass2<int>; Rest = {MyClass2<char>}; C = {MyClass2<int>, MyClass2<char>}]'
prog.cpp:17:29: required from 'MyClass3<C>::MyClass3() [with C = {MyClass2<int>, MyClass2<char>}]'
prog.cpp:38:57: required from here
prog.cpp:32:29: error: no matching function for call to 'MyClass3<MyClass2<int>, MyClass2<char> >::make_classes(std::vector<MyClass1*>&)'
make_classes<Rest...>(vec);
^
prog.cpp:27:55: note: candidate: template<class First, class ... Rest> void MyClass3<C>::make_classes(std::vector<MyClass1*>&) [with First = First; Rest = {Rest ...}; C = {MyClass2<int>, MyClass2<char>}]
template <class First, class... Rest> void make_classes(std::vector<MyClass1*> &vec) {
^
prog.cpp:27:55: note: template argument deduction/substitution failed:
prog.cpp:32:29: note: couldn't deduce template parameter 'First'
make_classes<Rest...>(vec);
使用可变参数模板完成此任务的正确方法是什么?请记住,我正在使用嵌入式平台,因此我的编译器与 C++11 兼容,但我无法真正使用大部分 STL 和 Boost。
【问题讨论】:
-
未使用的模板“编译良好”大多没有意义。虽然存在一些逻辑,但真正的测试是在您实例化它时。
-
另外,如果您使用的是 GCC,我建议您停止。 Clang 通常会提供明显更好的错误消息。
-
@xaxxon 我主要在 ARM Cortex 裸机上使用 GCC,但我认为 Clang 可能适用于该平台......