c++ - std::vector 的 Typedef 和 ostream 运算符

标签 c++ templates vector typedef ostream

我创建了一个 Chromosome 类,它最终只是一个带有 ostream 运算符的 vector 包装器,所以我决定改用 typedef vector 。但是,我在使用模板化的 ostream 运算符时遇到了问题……这是最好的方法吗? (我见过一些方法,但都没有奏效)

template<typename G>
class Chromosome {
 public:
  typedef typename std::vector<G> type;
  typedef typename std::pair<type *,type *> ptr_pair;
};

template<typename G> //line 19 below:
std::ostream& operator<<(std::ostream& os, const Chromosome<G>::type& chromosome) {
  for(auto iter = chromosome.begin(); iter != chromosome.end(); ++iter)
    std::cout << *iter;
  return os;
}

目前我得到的错误是:

chromosome.h:19: error: expected unqualified-id before ‘&’ token
chromosome.h:19: error: expected ‘)’ before ‘&’ token
chromosome.h:19: error: expected initializer before ‘&’ token

干杯。

最佳答案

不幸的是,没有干净的方法来做到这一点,因为编译器无法推断出 G 的类型。来自函数声明

template<typename G>
std::ostream& operator<<(std::ostream& os, const typename Chromosome<G>::type& chromosome);

原因是如果你要专攻Chromosome对于不同的类型,您最终可能会遇到编译器无法明确推断出 G 的情况。 .例如:

template <typename G> class Chromosome {
public:
    typedef std::vector<G> type; // No typename needed here, BTW
};

template <> class Chromosome<int> {
public:
    typedef std::vector<double> type;
};

现在,如果你这样做会发生什么?

vector<double> v;
cout << v << endl;

编译器无法判断 Gdoubleint在这种情况下,因为 Chromosome<int>Chromosome<double>vector<double>作为它们的嵌套类型。

要解决此问题,您必须明确使用类型 vector<G>作为参数:

template<typename G>
std::ostream& operator<<(std::ostream& os, const std::vector<G>& chromosome);

不幸的是,确实没有更好的方法来做到这一点。这并不是语言的真正缺陷,因为有充分的理由禁止它,但它确实会阻止您在这种情况下做您想做的事。

关于c++ - std::vector 的 Typedef 和 ostream 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4975722/

相关文章:

c++ - 优化析构函数的大小

c++ - 为什么 std::ranges::views::filter 不能将 std::isupper 作为参数?

c++ - 增加优先级队列中的优先级

visual-studio-2010 - Visual Studio 2010 制作和安装模板

c++ - 错误 : class template partial specialization contains a template parameter that cannot be deduced

c# - Unity - 如何根据当前位置计算具有偏移量的目标位置?

java - 为什么我无法在 Java 中将 Vector<Vector<Number>> 转换为 AbstractList<AbstractList<Number>>?

c++查找 vector 中元素的实际数量

c++ - Qt C++ - QList<float**> 类型不允许

c++ - 将结构元素插入有序集失败