gpt4 book ai didi

c++ - 如何重载 operator<< 以输出在模板内定义的 vector ?

转载 作者:太空狗 更新时间:2023-10-29 21:16:11 24 4
gpt4 key购买 nike

下面的示例是我所拥有的模板问题的精简版本 - 请参阅下面的编译错误。

#include <iostream>
#include <vector>

template <class T> struct S
{
typedef std::vector<T> SVec;
};

template <class T> std::ostream& operator<<(std::ostream& OS, const S<T>::SVec& X)
{
for (const auto& e: X) OS << e << ' ';
return OS;
}

int main()
{
S<int>::SVec v;
std::cout << v << std::endl;
}

编译器输出:

g++ -g -Wall -O4 -std=c++11 -c tc041.cpp
tc041.cpp:22:69: error: need ‘typename’ before ‘S<T>::SVec’ because ‘S<T>’ is a dependent scope
template <class T> std::ostream& operator<<(std::ostream& OS, const S<T>::SVec& X)

等等 - 数百行。我的编译器 - g++ 5.2.1,操作系统 - Xubuntu 4.2.0。

如何让这个算子被正确编译?

最佳答案

有两个问题:

  • 缺少 typename运算符声明中的关键字。
  • 模板类型推导失败 main .

template <class T>
std::ostream& operator<<(std::ostream& OS, const typename S<T>::SVec& X)

A typename关键词应该放在S<T>::SVec之前.由于语言规则,编译器不知道是否SVec是成员类型或其他类型。 typename关键字是告诉编译器它是一个类型。

详细语言规则可引用:http://en.cppreference.com/w/cpp/language/dependent_name


(注意:我其实不太确定,因为这个场景对我来说也是新的。)

让我们做一个实验。而不是调用 operator<<使用运算符语法,让我们使用函数语法调用它。

operator<< (std::cout, v);

嗯,还是失败了。

如果我们使用显式模板参数调用它会怎样?

operator<< <int> (std::cout, v);

有效!好吧,实际上,可能会奏效。我发现一些标准库头文件可能包含干扰它的东西。但让我们把它放在一边。

这个实验证明的问题是模板参数推导失败。 class-template-name<T>::member-type 形式的参数类型不能推导。

详情:http://en.cppreference.com/w/cpp/language/template_argument_deduction

关于c++ - 如何重载 operator<< 以输出在模板内定义的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com