我需要分配类型std :: vector = arma :: vec,即将犰狳数学库中的向量分配给std :: vector。
template <typename T>
std::vector<T>& std::vector<T>::operator=(arma::vec right) {
std::size_t s(right.size());
this->resize(s);
for (std::size_t i = 0; i < s; i++)
*this[i] = right(i);
return *this;
}
我尝试过这种方式,但是编译器不同意:
error: invalid use of incomplete type ‘class std::vector<_RealType>’
是否可以重载std :: vector类的赋值运算符?
答案 0 :(得分:1)
否,这是不可能的。如果扩展std
命名空间,甚至是未定义的行为,除非这些符号的标准明确允许。就是说,我看不到编译器会投入资源来跟踪它。但是,它可能与已经使用的符号冲突。
在我所知道的STL的实现中,很多功能都是在具有未指定名称的基类中实现的。
其中确实包含强制转换运算符:operator std::vector<int>() const
这需要添加到需要转换的类型中。但是,由于它也是库的一部分,所以我认为您没有有效的选择。
答案 1 :(得分:1)
要考虑的要点:
operator=
仅可作为成员函数重载。arma::vec
。使用它们而不是尝试定义oprator=
重载。示例代码演示了如何将不同种类的容器分配给std::vector
。
#include <iostream>
#include <vector>
#include <set>
int main()
{
std::vector<int> a;
int b[] = {1, 2, 3, 4, 5};
std::set<int> c{10, 20, 30, 40, 50};
a = {std::begin(b), std::end(b)};
for ( int el : a )
{
std::cout << el << " ";
}
std::cout << std::endl;
a.assign(std::begin(c), std::end(c));
for ( int el : a )
{
std::cout << el << " ";
}
std::cout << std::endl;
}
根据您的情况,您可以使用以下任意一种方式:
std::vector<YourType> v;
v = {std::begin(right), std::end(right)};
v.assign(std::begin(right), std::end(right));