Грешка на компилатора при конструиране на вектор от двойки

Моля, може ли някой да ми помогне да обясни защо получавам грешка, когато компилирам следния код с помощта на Xcode 5.1 на OS X. Apple LLVM версия 5.1 (clang-503.0.40) (базиран на LLVM 3.4svn).

Искам да конструирам X по-долу, като му предам вектор от двойки.

#include <iostream>
#include <string>
#include <vector>
#include <utility>

struct X
{
public:
    typedef std::vector<std::pair<std::string, std::string>> VectorType;

    X(VectorType& params) : m_params(params)
    {
    }

    VectorType m_params;
};

int main(int argc, const char * argv[])
{
    X::VectorType pairs
    {
        { "param-1", "some-string-1"},    // pair 0
        { "param-2", "some-string-2"},    // pair 1
        { "param-3", "some-string-3"},    // pair 2
        { "param-4", "some-string-4"},    // pair 3
        { "param-5", "some-string-5"},    // pair 4
        { "param-6", "some-string-6"},    // pair 5
        { "param-7", "some-string-7"}     // pair 6
    };

    X x
    {
        {pairs[0], pairs[2], pairs[5]}
    };

    return 0;
}

Отчетената грешка е:

/main.cpp:37:7: error: no matching constructor for initialization of 'X'
    X x
      ^
/main.cpp:6:8: note: candidate constructor (the implicit move constructor) not viable: cannot convert initializer list argument to 'X'
struct X
       ^
/main.cpp:6:8: note: candidate constructor (the implicit copy constructor) not viable: cannot convert initializer list argument to 'const X'
struct X
       ^
/main.cpp:11:5: note: candidate constructor not viable: cannot convert initializer list argument to 'VectorType &' (aka 'vector<std::pair<std::string, std::string> > &')
    X(VectorType& params) : m_params(params)
    ^
1 error generated.

person ksl    schedule 01.10.2014    source източник


Отговори (2)


Вашият конструктор трябва да вземе своя аргумент чрез const препратка

X(VectorType const & params)
             ^^^^^

В противен случай не можете да подадете временен вектор (както се опитвате да направите), тъй като временните елементи не могат да се обвържат с неконстантни lvalue препратки.

person Mike Seymour    schedule 01.10.2014
comment
Много благодаря. това не го знаех - person ksl; 01.10.2014

X има 3 конструктора:

  • Вашият дефиниран от потребителя, който потиска автоматичния ctor по подразбиране:

    X(VectorType& params)
    
  • Автоматично копиране и преместване:

    X(X&&) noexcept
    X(const X&)
    

Персонализираният очаква lvalue, никога xvalue или постоянен обект.
Вероятно искате да разделите ctor по следния начин:

X(const VectorType& params) : m_params(params) {}
X(VectorType&& params) : m_params(std::move(params)) {}
person Deduplicator    schedule 01.10.2014