gpt4 book ai didi

c++ - 解决参数依赖查找歧义的非侵入性方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:49 24 4
gpt4 key购买 nike

这是我的案例:

我正在尝试使用类型为 Foo::a 的库, 并指定一个 Foo::swap以及。我正在使用的另一个图书馆有一个 std::vector<Foo::a>实例化。我正在尝试使用 Visual Studio 11.0 在 Windows 上编译它并注意到 std::vector::swap向下映射到 _Swap_adl它执行不合格的交换调用。

这就是让我陷入 ADL 和模糊函数解析问题的原因。有没有什么魔法可以让我使用 Foo::swap (甚至 std::swap :)),没有对我正在使用的库进行一些“重大”更改(缺少从 Foo 中删除/重命名交换等的东西)?

编辑:添加一个捕获正在发生的事情和错误的最小示例。

#include <iostream>
#include <vector>

namespace Foo
{
class MyType
{
public:
float dummy;
};

template <class T>
void swap(T& a, T& b)
{
T c(a);
a = b;
b = c;
}
}

using namespace Foo;

class MyClass
{
public:
std::vector<MyType> myStructArr;
};

std::vector<MyType> getMyTypeArray()
{
MyType myType;
std::vector<MyType> myTypeArray;
myTypeArray.push_back(myType);
return myTypeArray;
}

namespace std
{
template <>
void swap<MyType*>(MyType*& a, MyType*& b)
{
MyType* c(a);
a = b;
b = c;
}

template <>
void swap<MyType>(MyType& a, MyType& b)
{
MyType c(a);
a = b;
b = c;
}
}

int main(int argc, char* argv[])
{
MyClass m;

MyType myTypeLocal;
std::vector<MyType> myTypeArrayLocal;
myTypeArrayLocal.push_back(myTypeLocal);

//m.myStructArr = myTypeArrayLocal;
m.myStructArr = getMyTypeArray();

return 0;
}

我不会评论代码的效率,因为它是我必须处理的东西,但错误日志位于@ http://pastebin.com/Ztea46aC 可以清楚地了解内部发生的事情。这是编译器特定的问题,还是可以从这段代码中获得更深入的学习?

编辑 2:我已经尝试专门针对所讨论的特定类型,但这并不能解决歧义。关于为什么会这样的任何指示也会有所帮助。

namespace std
{
template <>
void swap<MyType*>(MyType*& a, MyType*& b)
{
MyType* c(a);
a = b;
b = c;
}

template <>
void swap<MyType>(MyType& a, MyType& b)
{
MyType c(a);
a = b;
b = c;
}
}

http://pastebin.com/sMGDZQBZ 是这次尝试的错误日志。

最佳答案

如错误消息所述,函数调用不明确。有两个版本的 swap 可以应用:一个在命名空间 Foo 中,另一个在命名空间 std 中。第一个是通过参数相关查找找到的。找到第二个是因为 vector 是在 std 中定义的,所以看到了 std::swap(按设计)。

这不是一个声明隐藏另一个声明的情况;它只是一组可能的重载,因此适用于选择重载函数的通常排序规则。 swap 的两个版本采用相同的参数类型,因此没有优劣之分。

关于c++ - 解决参数依赖查找歧义的非侵入性方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15580236/

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