gpt4 book ai didi

c++ - Sun Studio 12 中的模板编译错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:33 24 4
gpt4 key购买 nike

我们正在迁移到 Sun Studio 12.1 和新的编译器 [CC: Sun C++ 5.10 SunOS_sparc 2009/06/03]。我在编译一段代码时遇到编译错误,该代码使用早期版本的 Sun Compiler [CC: Sun WorkShop 6 update 2 C++ 5.3 2001/05/15] 编译良好。

这是我得到的编译错误。

"Sample.cc": Error: Could not find a match for LoopThrough(int[2]) needed in main(). 1 Error(s) detected. *** Error code 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 中的错误吗?

如果是,我们如何提交错误报告?

最佳答案

在这种情况下,编译器不遵循标准并且存在错误。让我们回顾一下相关部分。

首先从 13.3/3 我们有:

...

— First, a subset of the candidate functions—those that have the proper number of arguments and meet certain other conditions—is selected to form a set of viable functions (13.3.2).

— Then the best viable function is selected based on the implicit conversion sequences (13.3.3.1) needed to match each argument to the corresponding parameter of each viable function.

所以这两个函数具有相同数量的参数并且被认为是候选函数。现在我们必须找到最好的可行函数,在

13.3.3:

let ICSi(F) denote the implicit conversion sequence that converts the ith argument in the list to the type of the ith parameter of viable function F. 13.3.3.1 defines the implicit conversion sequences and 13.3.3.2 defines what it means for one implicit conversion sequence to be a better conversion sequence or worse conversion sequence than another

那么我们有

Given these definitions, a viable function F1 is defined to be a better function than another viable function F2 if for all arguments i, ICSi(F1) is not a worse conversion sequence than ICSi(F2), and then

— for some argument j, ICSj(F1) is a better conversion sequence than ICSj(F2), or, if not that,

— F1 is a nontemplate function and F2 is a template function specialization, or, if not that,

— F1 and F2 are template functions, and the function template for F1 is more specialized than the template for F2 according to the partial ordering rules described in 14.5.5.2, or, if not that,

对于第一条规则(添加常量),这两个函数是相等的,第二条规则不适用(都是模板)。所以我们转向第三条规则。从 14.5.5.2(如果需要我会引用)我们了解到该函数的 const int 版本比 const Item 版本更专业,因此最匹配是 const int 重载,然后应调用它。

您最好的临时修复可能是第二次过载:

template<size_t SZ>
void LoopThrough(int (&Item)[SZ])
{
LoopThrough(static_cast<const int (&)[SZ]>(Item));
}

关于c++ - Sun Studio 12 中的模板编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11296389/

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