在参数化构造函数中使用移动语义

时间:2013-08-30 17:00:54

标签: c++ c++11 vector move

我有一个类,其中包含一个由std::vector<std::vector<T> >组成的属性。在参数化构造函数中,我使用了移动语义。 当我创建此类的对象时,我收到与constructor关联的编译器错误。有没有人知道如果使用move-semantics正确完成初始化?或者它实际上与vector<vector>本身有关吗?

template < class T, class L = size_t >
class Foo{
  public:
     ...
     Foo(std::vector<L> , std::vector<std::vector<T> > );
     ...
  private:
     ...
     std::vector<L> shape_; 
     std::vector<std::vector<T> > cost_;
     ...

};

template < class T, class L >
Foo<T,L>::Foo( std::vector<L> shape, std::vector< std::vector< T > > ucosts )
:shape_(std::move(shape)), cost_(std::move(ucosts))
{

}

以下是我初始化对象的方式:

typedef double termType;
typedef Foo<termType, int> myFoo;
std::vector<int> ushape(10);
std::vector< std::vector< termType> > ucosts(2, std::vector<termType> ( 5, 0 ) );
myFoo ff1(ushape, ucosts); // <------ DOES NOT WORK
Foo<termType, int> ff2(ushape, ucosts); // <------ DOES WORK

编译器消息错误是:`错误C2664:

'Foo<T,L>::Foo(std::vector<_Ty>,std::vector<std::vector<double>>)' : cannot convert
 parameter 2 from 'std::vector<_Ty>' to 'std::vector<_Ty>'
 1>          with
 1>          [
 1>              T=termType,
 1>              L=int,
 1>              _Ty=int
 1>          ]
 1>          and
 1>          [
 1>              _Ty=std::vector<float>
 1>          ]
 1>          and
 1>          [
 1>              _Ty=std::vector<double>
 1>          ]
 1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

1 个答案:

答案 0 :(得分:1)

termTypedouble,但Foo的模板参数为float。这意味着在ctor中,您试图将std::vector<double>移动到std::vector<float>,这当然是不可能的。

编辑: 实际上,错误甚至在移动之前就发生了 - 你试图传递一个std::vector<double>作为std::vector<float>参数的参数,而这也是不可能的。