简单的模板化函数,用于转换 std::vectors - "illegal use of this type as an expression"
Simple templated function to convert std::vectors - "illegal use of this type as an expression"
我编写了一个将std::vector从一种类型转换为另一种类型的快速方法:
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;
}
但是,编译器在开始括号后的行中出现"error C2275: 'B': illegal use of this type as a expression"的错误。起初我以为'B'在别处定义了,但改变两个模板类型名称会导致相同的错误。然后我觉得这些类型有点奇怪。但即使将两个模板形参都设为int也不会改变任何东西。
我怎么也看不出这种方法有什么问题。(虽然我觉得我可能只是对一些明显的东西视而不见,在这一点上)。只需重命名参数名称。它的名字隐藏了std::vector的名字。
或者按如下方式书写错误行
class vector<B> converted_vector;
即使用std::vector的详细类型名,以区别于对象(形参)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;
}
公关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;
}
您实际上不需要做这样的函数,相反,您所要做的就是使用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;
}
演示相关文章:
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- C++ "error: invalid use of void expression"
- 我看到"use of undeclared identifier"错误,有人可以告诉我如何解决它吗?
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++ "error: use of overloaded operator '*' is ambiguous"似乎只有一场比赛
- C++ "Invalid use of 'this' in non-member function" ,
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- C++14 遇到奇怪的"use of deleted function"错误
- 出现这种错误的原因是什么"invalid use of non-static data member "
- 模板类和'invalid use of incomplete type'错误
- "invalid use of incomplete type" .解决循环依赖关系
- 使用互斥锁和条件变量作为成员时如何修复"use of deleted function"?
- 构造函数导致"use of deleted function"错误
- 禁止显示"use of the 'X' attribute is a C++17 extension"警告
- 为什么包含标头会导致"use of auto before deduction of auto"错误?
- C++:避免"use of deleted function"错误
- VSCode 错误: "incorrect use of va_start"
- 为什么我会得到"Invalid use of :: (scope resolution operator)?"
- 如何修复库中的"invalid use of non-static member function" 导入另一个库
- c++ _bstr_t instead of use string