c++ - 我在解决简单的参数相关查找/模板类型推断问题时遇到问题

标签 c++ templates type-inference argument-dependent-lookup

我有这段代码,我不明白为什么 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;
}

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

最佳答案

你的问题是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 运算符(operator)。

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

相关文章:

haskell - 是什么让 Haskell 的类型系统比其他语言的类型系统多 "powerful"?

c++ - 是否可以在 C++0x 中使用 auto 执行以下操作?

c++ - C++ 函数返回迭代器

c++ - 为什么用cocos2d-x在白底Layer上画一个红色矩形Sprite这么难?

c++ - 为什么 C++ 赋值运算符需要返回类型?

c++ - 如何在编译时验证模板类是从给定类派生的?

javascript - emberjs 是否有与 Rails `yield :something` 等效的代码?

c++ - GCC 的 nm 列出了 method 的多个条目

c++ - 生成具有不同 Ctor 参数的对象实例化的模式

delphi - 基于泛型参数类型的类型推断(Delphi)