gpt4 book ai didi

c++ - 我在处理一个简单的参数相关查找/模板类型推断问题时遇到了麻烦

转载 作者:搜寻专家 更新时间:2023-10-31 00:31:01 25 4
gpt4 key购买 nike

我有这段代码,但我不明白为什么 std::cout 行没有编译...参数查找/模板参数推断似乎是正确的...

#include <iostream>

template<typename T>
struct A
{
struct M1
{
T x;
};
};

template<typename T>
std::ostream &operator<<(std::ostream &os, typename A<T>::M1 const &o)
{
os << o.x;
return os;
}


int main()
{
A<int>::M1 a;

std::cout << a; // This line fails

return 0;
}

顺便说一句,我正在尝试在不将 operator<<() 声明为内联函数的情况下执行此操作。

最佳答案

你的问题是T处于非推导上下文中。 C++ 只会进行简单的模式匹配,它不会反转可能的任意类型映射。

想象一下 A<void> 的特化那套 using M1=A<int>::M1 .现在都intvoid有效 T为你的<< .由于这个问题通常很难解决,C++ 甚至拒绝尝试:​​您只能对参数类型的直接模板参数进行模式匹配。

做你真正想做的事:

template<typename T>
struct A {
struct M1 {
T x;
friend std::ostream& operator<<(std::ostream& os, M1 const& m1){
return os << m1.x;
}
};
};

学会爱上 Koenig 运算符。

关于c++ - 我在处理一个简单的参数相关查找/模板类型推断问题时遇到了麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35167852/

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