This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:C2000 18.1.4.LTS 生成错误#1581-D

Guru**** 2448780 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/764305/compiler-c2000-18-1-4-lts-produces-false-error-1581-d

工具/软件:TI C/C++编译器

我将在我们的代码库上验证18.1.4.LTS、并得到错误诊断:

>>编译失败
ServoLibrary/MotionControl/Brak/subdir_rules.mk:9:目标'ervoLibrary/MotionControl/Brak/Brakil.obj 的配方失败
"C:\devel\ServoApplication\ServoLibrary\hal\TMS320C28346\include\.\.\.\.\.\.\.\.\.\.\service\math\math\absolute.h:1574:#math:#mutterment-ral:-math operator+(const 服务::数学:相对 &、const 服务::数学:绝对 &)"声明一个非模板函数-添加<>以引用模板实例
"C:\devel\ServoApplication\ServoLibrary\hal\TMS320C28346\include\..\..\..\..\service\math\absolute.h"、第90行:错误#1581-D:"service::::::math: absolute operator-(const 服务::数学::相对 &、const 服务::数学:绝对 &)"声明非模板函数-添加<>以引用模板实例
"C:\devel\ServoApplication\ServoLibrary\hal\TMS320C28346\include\..\..\..\..\service\math\relative .h"、第130行:错误#1581-D:"service:::::math:absolute operator+(const 服务::数学::绝对 &、const 服务::数学:相对 &)"声明非模板函数-添加<>以引用模板实例
"C:\devel\ServoApplication\ServoLibrary\hal\TMS320C28346\include\..\..\..\..\service\math\relative .h"、第160行:错误#1581-D:"service:::::math:absolute operator-(const 服务::数学::绝对 &、const 服务::数学:相对 &)"声明非模板函数--添加<>以引用
在编译中检测到的模板实例4错误... 

显然、编译器认为模板类的非内联好友必须是模板本身。 但是,在这种情况下,朋友是在伙伴类中内联定义的,并且存在朋友声明,以便在必须从兼容类型隐式构建两个参数之一的情况下启用参数相关查找。

以下是相关代码减去注释(以使其更紧凑):

#ifndef _service_Math_Absolute_H_
#define _service_Math_Absolute_H_

命名空间服务{
命名空间数学{

template 
结构相对;

模板 
struct absolute
{
绝对值(t const& rvalue):mValue (rvalue){}

朋友绝对是 运算符+(绝对值 CONST& rLSummand、
相对 CONST& rRMAND)
{
返回 rLSummand.mValue + rRSummand.mValue;
}

//错误#1581
朋友绝对是 运算符+(相对 const&、绝对 const&);

朋友绝对是 运算符-(绝对值 const& rMinuend、
相对 const& rSubtrahend)
{
返回 rMinuend.mValue - rSubtrahend.mValue;
}

//错误#1581
朋友绝对是 运算符-(相对 const&、绝对 const&);

亲戚朋友 运算符-(绝对值 const& rMinuend、
绝对值 const& rSubtrahend)
{
返回 rMinuend.mValue - rSubtrahend.mValue;
}

Friend bool 运算符==(绝对值 const& rLs、绝对值 常量和右量)
{
返回 rLhs.mValue = rRhs.mValue;
}

Friend bool 运算符!=(绝对值 const& rLs、绝对值 常量和右量)
{
返回 rLhs.mValue!= rRhs.mValue;
}

Friend bool 运算符<(绝对值 const& rLs、绝对值 常量和右量)
{
返回 rLhs.mValue < rRhs.mValue;
}

Friend bool 运算符<=(绝对值 const& rLs、绝对值 常量和右量)
{
返回 rLhs.mValue <= rRhs.mValue;
}

朋友 bool 运算符>(绝对 const& rLs、绝对值 常量和右量)
{
返回 rLhs.mValue > rRhs.mValue;
}

Friend bool 运算符>=(绝对值 const& rLs、绝对值 常量和右量)
{
返回 rLhs.mValue >= rRhs.mValue;
}

t mValue;
};

}/*命名空间数学*/
}/*命名空间服务*/

#endif /*_service_Math_Absolute_H_*/


#ifndef _service_Math_Relate_H_
#define _service_Math_Relate_H_

命名空间服务{
命名空间数学{

template struct absolute;
template 结构相对;

模板 
直列相对 操作员%(相对 const& rDivent、
相对 const& rQuotient)
{
返回 rDivident.mValue % rQuotient.mValue;
}

模板 
结构相对
{
Relative (T const& rvalue):mValue (rvalue){}

亲戚朋友 运算符+(相对 CONST& ROP)
{
返回 ROP;
}

亲戚朋友 运算符-(相对 CONST& ROP)
{
返回- ROP.mValue;
}

//错误#1581 
朋友绝对是 运算符+(绝对值 const&、相对 const&); 朋友绝对是 运算符+(相对 CONST& rLSummand、 绝对值 CONST& rRMAND) { 返回 rLSummand.mValue + rRSummand.mValue; } 亲戚朋友 运算符+(相对 CONST& rLSummand、 相对 CONST& rRMAND) { 返回 rLSummand.mValue + rRSummand.mValue; } //错误#1581
朋友绝对是 运算符-(绝对值 const&、相对 const&); 朋友绝对是 运算符-(相对 const& rMinuend、 绝对值 const& rSubtrahend) { 返回 rMinuend.mValue - rSubtrahend.mValue; } 亲戚朋友 运算符-(相对 const& rMinuend、 相对 const& rSubtrahend) { 返回 rMinuend.mValue - rSubtrahend.mValue; } 亲戚朋友 运算符*(相对 const&rLFactor、 相对 常量和 rRFactor) { 返回 rLFactor.mValue * rRFactor.mValue; } 亲戚朋友 运算符/(相对 const& rDivent、 相对 const& rQuotient) { 返回 rDivident.mValue /rQuotient.mValue; } 亲戚朋友 操作员%(相对 const& rDivent、 相对 const& rDivisor) { 退货操作员% (rDivident、rDivisor); } 朋友 bool 运算符==(Relative 常量和左侧、相对 常量和右量) { 返回 rLhs.mValue = rRhs.mValue; } 朋友 bool 运算符!=(相对 常量和左侧、相对 常量和右量) { 返回 rLhs.mValue!= rRhs.mValue; } 朋友 bool 运算符<(相对 常量和左侧、相对 常量和右量) { 返回 rLhs.mValue < rRhs.mValue; } Friend bool 运算符<=(相对 常量和左侧、相对 常量和右量) { 返回 rLhs.mValue <= rRhs.mValue; } 朋友 bool 运算符>(相对 常量和左侧、相对 常量和右量) { 返回 rLhs.mValue > rRhs.mValue; } Friend bool 运算符>=(相对 常量和左侧、相对 常量和右量) { 返回 rLhs.mValue >= rRhs.mValue; } t mValue; }; #pragma diag_pop }/*命名空间数学*/ }/*命名空间服务* /#endif /*_service_Math_Relative _H_*/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我并不完全确定、但我认为您在 本常见问题解答 中讨论了问题(不是来自 TI)。  下面随附的文件有一些需要考虑的更改。  将其与您在帖子中显示的第一个头文件进行比较。  这些更改是根据常见问题解答中讨论的第一个解决方案进行调整的。   

    谢谢、此致、

    乔治

    e2e.ti.com/.../absolute.h.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题是、它们不是模板函数、也不应该是模板函数。

    模板函数仅具有精确匹配、因此它们不会从兼容类型调用隐式构造。

    例如:

    绝对值 R = 3 +绝对值 (5) 

    使用非模板函数、因为唯一的运算符+具有 RHS 绝对值 运算符+(相对 ,绝对 )和相对 可由 int 隐式构造。

    在您的版本中、不会匹配运算符、因为模板仅具有精确匹配。

    BTW、C2000 6.1.0按照我在此处发布的方式接受我的代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我应该提到、我构建的是--emit_warning_as 错误(因为人们不关心警告)。 我可以使用#pragma diag_suppress 1581关闭 offendig 诊断。

    问题在于 C2000 6.1.0不知道诊断1581 (因此在我添加 pragma 时会发出错误)。 它还不知道 diag_push 和 diag_pop pragma、这是一个麻烦、但实际上并不是一个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您的程序链接没有问题、则可以抑制这些诊断。  要仅在使用编译器版本18.1.0.x.LTS 和更高版本时禁止它们,请在每个头文件中添加如下所示的代码...

    //如果编译器版本>= 18.1.0.LTS,则抑制诊断
    //关于声明非模板函数
    #if __TI_Compiler_version__>=18001000
    #pragma diag_suppress 1581
    #endif 

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这对我来说很有用。 我仍然认为您的警告政策已被破坏。

    clang 和 gcc 都规定了一项策略、不在-Wall 中包含带有误报的警告。 有一个单独的标志、包括不可靠的警告、-Wmings。

    由于误报、这不是我第一次必须关闭诊断。 我在这里所做的是一项众所周知的技术、请参阅 Scott Meyers 的有效 C++第三版第46项。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我理解您的观点。  不过、您所说的错误肯定是其他用户可能会调用有用的诊断。  这就是编译器诊断程序具有不同级别(备注、警告、错误)的原因、许多诊断程序(尽管不是全部)可以由用户更改其级别的原因。  有关详细信息、请在 C2000编译器手册中搜索 标题为 了解诊断消息和 诊断消息 pragma 的子章节。

    谢谢、此致、

    乔治