2014-10-01 2 views
0

Возможно, кто-то поможет объяснить, почему я получаю сообщение об ошибке при компиляции следующего кода с помощью Xcode 5.1 в OS X. Apple LLVM version 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. 

ответ

4

Ваш конструктор должен принимать аргумент по const ссылкой

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

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

+0

Большое спасибо. Я этого не знал. – ksl

3

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

  • Ваш определенный пользователем один, который подавляет автоматический по умолчанию-CTOR:

    X(VectorType& params) 
    
  • автоматического копирования и т е р въезду т е р:

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

Обычай один ожидает именующее выражение, никогда в xvalue или постоянный объект.
Вы, вероятно, хотите разделить CTOR таким образом:

X(const VectorType& params) : m_params(params) {} 
X(VectorType&& params) : m_params(std::move(params)) {} 
Смежные вопросы