简单模板化函数转换std :: vectors - "非法使用此类型作为表达式"

时间:2014-06-18 18:43:52

标签: c++ templates std

我写了一个快速方法将std :: vectors从一种类型转换为另一种类型:

template<class A, class B>
vector<B> ConvertSTDVector_AToB(vector<A> vector)
{
    vector<B> converted_vector;

    for(unsigned int i= 0; i< vector.size(); i++)
        converted_vector.push_back(vector[i]);

    return converted_vector;
}

但是编译器错误&#34;错误C2275:&#39; B&#39; :非法使用此类型作为表达式&#34;在开放支架后的线上。起初我想到了某种方式&#39; B&#39;在其他地方定义,但更改两个模板类型名称会导致相同的错误。然后我觉得这些类型的东西很奇怪。但即使制作两个模板参数也不会改变任何东西。

我不能为我的生活看到这种方法有什么问题。 (虽然我觉得我可能只是对一些显而易见的东西视而不见了。)

2 个答案:

答案 0 :(得分:4)

只需重命名参数名称即可。它的名字隐藏了std :: vector名称。

或者按照以下方式写错字

class vector<B> converted_vector;

使用std :: vector的详细类型名称来区分它与object(parameter)vector。

函数的代码可以用不同的方式编写。例如

template<class A, class B>
vector<B> ConvertSTDVector_AToB(vector<A> vector)
{
    class vector<B> converted_vector( vector.begin(), vector.end() );

    return converted_vector;
}

PR

template<class A, class B>
vector<B> ConvertSTDVector_AToB(vector<A> vector)
{
    class vector<B> converted_vector;

    converted_vector.assign( vector.begin(), vector.end() );
    return converted_vector;
}

等等。

答案 1 :(得分:1)

您不必真正做这样的功能,而您只需使用std::copy,前提是您要转换的对象可通过提供重载转换运算符互相转换。就像下面的例子一样:

#include <vector>
#include <iostream>
#include <algorithm>

class B;

class A {
  friend std::ostream& operator<<(std::ostream &out, A const &a);
  int id;
public:
  A() : id(0) { }
  A(int const _id) : id(_id) { }
  operator B() const; 
};

class B {
  friend std::ostream& operator<<(std::ostream &out, B const &b);
  int id;
public:
  B() : id(0) { }
  B(int const _id) : id(_id) { }
  operator A() const { return A(id); }
};

A::operator B() const { return B(id); }

std::ostream& operator<<(std::ostream &out, A const &a) { return (out << a.id); }
std::ostream& operator<<(std::ostream &out, B const &b) { return (out << b.id); }

int main() {
  std::vector<B> bv{B(1), B(2), B(3), B(4), B(5)};
  std::vector<A> av(bv.size());
  std::vector<B> bbv(bv.size());
  std::copy(bv.begin(), bv.end(), av.begin());
  for(auto i : av) std::cout << i << " ";
  std::cout << std::endl;
  std::copy(av.begin(), av.end(), bbv.begin());
  for(auto i : bbv) std::cout << i << " ";
  std::cout << std::endl;  
  return 0;
}

DEMO