【发布时间】:2012-07-02 15:11:04
【问题描述】:
我们正在迁移到 Sun Studio 12.1 并使用新的编译器 [ CC: Sun C++ 5.10 SunOS_sparc 2009/06/03 ]。我在编译使用早期版本的 Sun 编译器 [CC: Sun WorkShop 6 update 2 C++ 5.3 2001/05/15] 编译良好的代码时遇到编译错误。
这是我得到的编译错误。
“Sample.cc”:错误:找不到 LoopThrough(int[2]) 的匹配项 在 main() 中需要。 1 检测到错误。 *** 错误代码 1。
代码:
#include <iostream>
#define PRINT_TRACE(STR) \
std::cout << __FILE__ << ":" << __LINE__ << ":" << STR << "\n";
template<size_t SZ>
void LoopThrough(const int(&Item)[SZ])
{
PRINT_TRACE("Specialized version");
for (size_t index = 0; index < SZ; ++index)
{
std::cout << Item[index] << "\n";
}
}
/*
template<typename Type, size_t SZ>
void LoopThrough(const Type(&Item)[SZ])
{
PRINT_TRACE("Generic version");
}
*/
int main()
{
{
int arr[] = { 1, 2 };
LoopThrough(arr);
}
}
如果我用通用版本取消注释代码,代码编译得很好并且通用版本被调用。在禁用扩展的 MSVC 2010 和 ideone here 的情况下,我没有看到这个问题。 调用该函数的专用版本。现在的问题是,这是 Sun Compiler 中的错误吗?
如果是,我们如何提交错误报告?
【问题讨论】:
-
删除 const 可能会起作用吗?
-
如果最新版本的clang、gcc、comeau 和msvc 一致,则可能是SunCC 中的一个错误。另请注意,SunCC 因错误而闻名。这就引出了一个问题:为什么不使用 gcc?
-
我希望您同意我的观点,即切换供应商的依赖项太多了。我只是一台非常大的机器上的螺丝钉:-)
-
@Jagannath:当代码是标准 C++ 时,可能的依赖项应该是最少的......如果你使用的是 SunCC 特定的扩展,那么......
-
对此不同意。如果使用标准,应该没有依赖关系。使用 gcc/4.7.0 编译良好,调用专用版本。
标签: c++ templates overload-resolution partial-specialization sunstudio