gpt4 book ai didi

C++ STL 无法找到嵌套类的比较器

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:33 24 4
gpt4 key购买 nike

我希望这段代码能工作,但它无法用 GCC 编译。如果您将内部类取出,它确实可以编译。

#include <algorithm>

template <typename T>
struct Outer
{
struct Inner
{
int x;
};
Inner vec[3];
};

template <typename T>
bool operator <(const typename Outer<T>::Inner& lhs, const typename Outer<T>::Inner& rhs)
{
return lhs.x < rhs.x;
}

int main()
{
Outer<int> out;
Outer<int>::Inner in;
std::lower_bound(out.vec, out.vec + 3, in);
}

GCC 4.4 是这样说的:

...
bits/stl_algo.h:2442: error: no match for ‘operator<’ in ‘* __middle < __val’

GCC 4.7 打印了更多的东西,包括上面的,以这个结尾:

...
bits/stl_algobase.h:957:4: note: couldn't deduce template parameter ‘T’

我愿意相信它不是良构的 C++,但为什么不呢?

最佳答案

您提到的问题是编译器无法推导出模板参数T。这是因为 typename Outer::Inner 是 T 的非推导上下文上下文。

当模板参数仅在非推导上下文中使用时,模板参数推导不会考虑它。详情请参阅 C++ 标准 (2003) 的第 14.8.2.4 节。

为什么?如果您将 Outer 专门化为:

template <>
struct Outer<int>
{
struct Inner
{
double y;
};
Inner vec[3];
};

编译器无法推断 Outer::Inner 应该引用这个定义还是之前的定义。

现在,进入解决方案。有几种可能的解决方案:

  1. 将运算符<移入 Inner 并使其成为友元函数。
  2. 定义运算符< inside Inner like M M.建议。
  3. Johannes Schaub - litb 建议:从由 inner 参数化的 CRTP 基础派生 inner。然后将参数类型设为 CRTP 类并将参数引用转换为派生内部类,其类型由您推导的模板参数给出。

我试用了 CRTP方法,因为它听起来很酷!:

template <typename Inner>
struct Base
{
};

template <typename T>
struct Outer
{
struct Inner : Base<Inner>
{
T x;
};
Inner vec[3];
};

template <typename T>
bool operator< (const Base<T>& lhs, const Base<T>& rhs)
{
return static_cast<const T&>(lhs).x < static_cast<const T&>(rhs).x;
}

相关答案:1 , 2 , 3

关于C++ STL 无法找到嵌套类的比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16074649/

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