0

コンパイルの問題エラー: 'std::vector' の初期化に一致するコンストラクターがありません

私が構築しているコード ベースには、可変個引数のテンプレート パラメーターである必要のないオブジェクトがいくつかあります。std::any のベクトルを受け入れるようにしたかったのです。私のオブジェクトは、H1、H2、PARAGRAPH などの HTML エンティティにちなんで名付けられています。

オブジェクト作成のインターフェース。

    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 です

テンプレート関数を呼び出すと、属性オブジェクトが渡されます。テンプレート パラメーター内の 1 つで、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で見ることができます。あなたが言及したように、ポインタではなく、任意のオブジェクトにデータを含めたいと思います。

4

1 に答える 1