2010-12-16 45 views
0

与MSVC8 Terse错误消息:有什么办法可以更明确吗?

Baz<Foo, Bar> blah_blah(Foo const& f, Bar const& b) 
{ return Baz<Foo, Bar>(f, b); } 

,我得到这个错误:

error C2893: Failed to specialize function template 'Baz<Foo, Bar> blah_blah(Foo, Bar)' 
with the following template arguments: 
'ConcreteFoo' 
'ConcreteBar' 

这绝对是无用的,可能会需要我很多的时间来调查问题(涉及相当多毛的模板和ConcreteFooConcreteBar本身就是多毛的模板)。

我想知道哪些类型/成员对象/成员函数从ConcreteFooConcreteBar中丢失,它们阻止了Baz模板的实例化。

有没有办法解决这个来自Visual C++ 2005的白痴错误报告?

编辑(相关):巴兹,ConcreteFoo和ConcreteBar是这样的:

template <typename T, typename U, bool = f(T, U), int = g(T, U), etc> 
struct Baz 
{ ... } 

而且有相当多的部分特例。我知道哪一个来自编译器消息。另外,函数f和g是丑陋的元编程的东西,我相信我的问题来自那里:有一个f或g不能产生正确的结果。 ConcreteFoo或ConcreteBar中必须有一些类型/静态成员缺失,我不知道哪一个。另外,我很难抓住项目的相关部分,编写一个测试项目,我想要更多的“内联”项目。

+0

为什么不发布完整的错误信息,因为它是? – 2010-12-16 11:41:07

+0

这肯定会违反我的NDA。错误信息只是我发布的错误信息,尽管名称不同。 – 2010-12-16 11:41:40

+1

当编译器没有帮助时,我尝试隔离问题。例如,我会尝试:使函数返回void并重新编译(以清空实现函数);尝试使用其他参数类型,比如int等...... – gnobal 2010-12-16 12:02:43

回答

0

ConcreteFoo和ConcreteBar是模板还是类?那么你是在尝试专业化还是部分专业化?

很难分辨何时我们看不到完整的失败示例。

顺便说一下,你有责任编译器之前,你试过你的代码在另一个编译器,如comeau tryitout吗?

+1

在一个大型的代码库上,移植到另一个编译器上并不容易。有太多的依赖关系,你只会浪费时间做这件事。当他说NDA时,这意味着他在他的工作场所正在谈论代码。如果您开始在论坛上发布工作代码,您将必须犯牢。 – DumbCoder 2010-12-16 12:41:37

+0

这是一个完整的专业化。 ConcreteBar和ConcreteFoo完全专注于编译器抱怨的地步。实际上,MSVC没有实现两遍查找,因此ConcreteBar和ConcreteFoo不依赖于它。 – 2010-12-16 13:01:02

+0

无论如何,请参阅编辑问题。 – 2010-12-16 13:01:39

相关问题