我创建了一个 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;
编译器无法判断 G
是double
或 int
在这种情况下,因为 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/