gpt4 book ai didi

c++ - 如何在模板类的嵌套类中提供友元运算符的定义?

转载 作者:可可西里 更新时间:2023-11-01 18:37:38 25 4
gpt4 key购买 nike

这个有效:

template<class Tim>
struct Bob
{
struct Dave
{
Tim t{};
friend bool operator < (const Dave& a, const Dave& b)
{
return a.t < b.t;
}
} d;
};

这不起作用:

template<class Tim>
struct Bob
{
struct Dave
{
Tim t{};
friend bool operator < (const Dave& a, const Dave& b);
} d;
};

template<class Tim>
bool operator < (const typename Bob<Tim>::Dave& a, const typename Bob<Tim>::Dave& b)
{
return a.t < b.t;
}

例如,当我尝试在 map 中使用它时,出现链接器错误:

1>ConsoleApplication1.obj : error LNK2019: unresolved external symbol "bool __cdecl operator<(struct Bob<int>::Dave const &,struct Bob<int>::Dave const &)" (??M@YA_NABUDave@?$Bob@H@@0@Z) referenced in function "public: bool __thiscall std::less<struct Bob<int>::Dave>::operator()(struct Bob<int>::Dave const &,struct Bob<int>::Dave const &)const " (??R?$less@UDave@?$Bob@H@@@std@@QBE_NABUDave@?$Bob@H@@0@Z)

.

int main()
{
std::map<Bob<int>::Dave, int> v;
v[{}];
}

如何在类之外正确定义此运算符?

最佳答案

您通常会通过前向声明模板类和友元函数,然后在类定义中提供特化来做这样的事情。然而,在这种情况下它并不那么容易 - 具有依赖类型将 Tim在非推导上下文中上课,因此推导将失败。但是,有一种解决方法:

#include <iostream>
#include <type_traits>
#include <map>

template<class T>
struct Bob;

template<typename T, typename>
bool operator < (const T& a, const T& b);

struct DaveTag {};

template<class Tim>
struct Bob
{
struct Dave : DaveTag
{
Tim t{};


friend bool operator < <Bob<Tim>::Dave, void>(const typename Bob<Tim>::Dave& a, const typename Bob<Tim>::Dave& b);
} d;
};

template<typename T, typename = typename std::enable_if<std::is_base_of<DaveTag, T>::value>::type>
bool operator < (const T& a, const T& b)
{
return a.t < b.t;
}

struct X {
double t;
};

int main()
{
std::map<Bob<int>::Dave, int> v;
v[{}];

// This won't work
// X x, y;
//bool b = x < y;

}

基本上,我在这里所做的是让编译器推导出完整的 Bob<Tim>::Dave作为 operator< 的模板参数.然而,很明显,一个简单的定义将允许为 T 推导任何类型。可能会导致一些难以理解的问题。为了避免它,我添加了一个小标签类 DaveTag这允许防止我们非常通用的实例化 operator<除了Dave .

关于c++ - 如何在模板类的嵌套类中提供友元运算符的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33059924/

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