这是我的情况:
我正在尝试使用具有 typeFoo::a
并指定 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是这次尝试的错误日志。