编译问题错误:没有匹配的构造函数来初始化'std :: vector'
我正在构建的代码库中有多个对象,不需要是可变参数模板参数。我想让他们接受std :: any的向量。我的对象以HTML实体(例如H1,H2,PARAGRAPH)命名。
用于创建对象的界面。
template <class TYPE>
auto _createElement(const std::vector<std::any> &attrs) -> TYPE & {
std::unique_ptr<TYPE> e = std::make_unique<TYPE>(attrs);
ViewManager::elements.push_back(std::move(e));
return static_cast<TYPE &>(*ViewManager::elements.back().get());
}
template <class TYPE, typename... ATTRS>
auto createElement(const ATTRS &... attribs) -> TYPE & {
std::vector<std::any> attrvector{attribs...};
return _createElement<TYPE>(attrvector);
}
在createElement函数上扩展到矢量的模板参数包未编译。我使用的版本是c ++ 17
当我调用模板函数时,我正在将属性对象传递给它。模板参数中的一个,类似于HTML实体名称,但全部大写。在参数包中是属性。这些属性也是对象。
例如,以下内容在模板头文件viewManager.hpp中定义
using PARAGRAPH = class PARAGRAPH : public Element {
public:
PARAGRAPH(const std::vector<std::any> &attribs)
: Element({listStyleType::disc, marginTop{1_em}, marginLeft{1_em},
marginBottom{0_em}, marginRight{0_em}}) {
setAttribute(attribs);
}
};
在应用程序中,例如main.cpp
auto &mainArea = createElement<DIV>(
indexBy{"mainArea"}, objectTop{10_pct}, objectLeft{10_pct},
objectWidth{90_pct}, objectHeight{90_pct}, textColor{50, 50, 50},
background{100, 200, 200}, textFace{"FiraMono-Regular"},
textSize{20_pt}, textWeight{400});
如您所见,该语法使用用户定义的文字,这些文字返回numericFormat对象。
到目前为止,我可以在C++ Source上找到完整的资源。我希望任何对象都包含数据,而不是您提到的指针。
答案 0 :(得分:1)
我认为您的问题完全取决于_createElement
的行为,我认为这是您正在使用的某些库函数。稍微更改代码以仅返回attrvector
不会显示任何问题:
#include <iostream>
#include <vector>
#include <any>
template <typename... ATTRS>
std::vector<std::any> createElement(const ATTRS &... attribs) {
std::vector<std::any> attrvector{attribs...};
return attrvector;
}
using namespace std;
int main(int argc, char *argv[]) {
auto vec = createElement(1.0f,2.0f,3u,4u,-1,"hello");
for (const auto& z : vec) {
std::cout << z.type().name() << std::endl;
}
}
打印(使用C ++ 17兼容版本的clang ++)
f
f
j
j
i
PKc