【发布时间】:2016-12-27 20:42:06
【问题描述】:
我遇到了以下问题。我使用的是 Xcode 7,我的项目没有问题。尝试在 Visual Studio Express 2015 上编译它后,我在代码中收到消息 "Error C2668 ambiguous call to overloaded function"。我找不到与该问题相关的特定于 Visual Studio 的任何内容。
我做了一个应该在 VS 上使用的最小工作示例(Xcode 上没有错误)。奇怪的部分涉及func2 部分。就好像 VS 编译器无法自动推断出比限制更多的类型和/或参数。
更新:
Sam Varshavchik 提出了一种解决方法,即使用带有中间模板类的部分特化。这是我想避免的解决方案。首先是因为它在我的代码中应用的上下文中不方便,其次是因为我不清楚这个编译错误。这个错误在 Xcode7 中没有出现,func2 甚至在 VS 中也没有错误。尽管我同意 WhiZTiM 的解释,但事实是,在这种情况下,重载有时可行,有时不行。我真的很想知道为什么。
更新 2:
根据 bogdan 的说法,这可能是 GCC 和 MSVC 中的一个错误。我会尝试报告它。 (我非常喜欢视觉工作室的第一周)
更新 3:
在https://connect.microsoft.com/VisualStudio/feedback/details/3076577 报告的错误
函数.h:
template <class T>
class BX {
public :
BX() {}
~BX() {}
};
template <class T1, class T2>
class G {
public :
G() {}
~G() {}
};
template <template <class T> class T1, class T>
class DT {};
class B {
public :
//I want func to work
template <template <class T> class T1, class T, class M>
static void func(const M& m, const DT<T1, T>* dt, T1<T>& val) {}
template <template <class T> class T1, class T, class M>
static void func(const G<T1<T>, M>& g, const DT<T1, T>* dt, T1<T>& val) {}
//here is a small variation of func as a test
template <template <class T> class T1, class T, class M>
static void func2(const M& m, const DT<T1, T>* dt) {}
template <template <class T> class T1, class T, class M>
static void func2(const G<T1<T>, M>& g, const DT<T1, T>* dt) {}
};
main.cpp
int main() {
BX< int > bx;
G<BX< int >, int> g;
DT<BX, int>* dt;
B::func(g, dt, bx);//Error C2668 'B::func': ambiguous call to overloaded function
B::func2(g, dt);//no error
}
【问题讨论】:
-
请不要发布带有无效
void main的代码示例。它会误导新手,并且需要在尝试之前编辑代码。 FTFY。 -
这看起来像是一个 MSVC(和 GCC)错误。根据函数模板的部分排序规则,第二个模板重载比第一个更专业。这就是为
func2正确选择第二个重载的原因。重载分辨率对于func应该同样有效。该示例应进一步减少并报告为错误。 -
@bogdan,你测试了吗?我很担心整个行为只会出现在我的系统上。此外,减少示例很棘手,实际上我已经为 MWE 做过。我的代码中实际等效的 func 比本主题中提供的 func 更复杂。我减少了它,直到我发现另一个'sistership' func2 编译正常。简而言之:减少 func 使其编译。
-
是的,它可以在 MSVC 2015 Update 3 上完全重现。通过减少它,我的意思是类似于 this。
-
好的,感谢其他 MWE。我尝试向微软报告它,但我显然不允许报告错误。你认为我应该使用gcc.gnu.org/bugzilla 直接向 gcc 报告吗?我以前从来没有这样做过。我还想知道,如果我希望尽快修复这个错误,哪种方式应该是最快的,gcc 还是 microsoft?但也许这种事情需要数年才能得到解决
标签: c++ visual-studio templates overloading