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.

[参考译文] Compiler/TMS320C6747:无法编译模板代码

Guru**** 2589280 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/611989/compiler-tms320c6747-unable-to-compile-template-code

器件型号:TMS320C6747
Thread 中讨论的其他器件:SYSBIOS

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

我认为编译器中存在错误、因为在编译数组版本时、它似乎错误地尝试编译模板的非数组版本。

以下代码生成此错误:  

subdir_rules.mk:23:目标'main.obj'的配方失败
"./main.cpp"、第159行:错误#138:表达式必须是可修改的 lvalue

代码如下:

/*
*==== main.c ======
*

#include

#include
#include

#include

#include


#include


/*
*==== taskFxn ====
*
void taskFxn (UARg a0、UARg A1)

system_printf ("enter taskFxn ()\n");

Task_sleep (10);

system_printf ("exit taskFxn ()\n"\});

typedef unsigned int uint32;
typedef unsigned short uint16;

命名空间内部

Eraser 类

公共:
模板
橡皮擦(常量 T&t)
:mpData (新实施 (T))

模板
橡皮擦(const T (&t)[i])
:mpData (新 ArrayImpl (T、I))

~Eraser()

删除 mpData;

void* GetData()

返回 mpData->GetData();

专用:

结构接口

虚拟~接口()


虚拟 void* GetData()= 0;
};

模板
类 Impl:公共接口

公共:
IMPL (const T&t)
:mpData (新 T (t))


虚拟~Impl()

删除 mpData;

虚拟 void* GetData()

返回 mpData;

专用:
t* mpData;
};

模板
Class ArrayImpl:公共接口

公共:
ArrayImpl (const T* t、std::size_t 计数)
:mpData (新 T[count])

for (std::size_t i = 0;i < count;+i)

mpData[i]= t[i];


虚拟~ArrayImpl()

删除[] mpData;

虚拟 void* GetData()

返回 mpData;

专用:
t* mpData;
};

可路复用接口* mpData;
};


类元素信息

公共:
元素信息()
:mpDataType(0)
,mpData(0)

const std::type_info& GetDataType()

返回*mpDataType;

内部::Eraser* GetData()

返回 mpData;

专用:
const std::type_info* mpDataType;
内部::Eraser* mpData;
};

int mCurrentSize = 10;
ElementInfo* mpElementes;

//设置模板非数组版本
模板
空集(uint32 dataId、const T& data)

if (dataId < mCurrentSize)

//在 CCS 中,此行会导致错误:"../main.cpp",第165行:错误#138:表达式必须是可修改的 lvalue
*重新解释_cast (mpElements[dataId].GetData()->GetData()= data;

//设置,模板数组版本。
模板
空集(uint32 dataId、const T (&data)[i])

if (dataId < mCurrentSize)

对于(uint32 I = 0;I < I;+I)

reinterpret_cast (mpElements[dataId].GetData()->GetData())[i]=数据[i];


空 RunTestCode()

int maxNumberOfElements = mCurrentSize;
mpElements=新元素信息[maxNumberOfElements];

uint32 dataId0 = 1;

uint16 dataValue = 100;
设置(dataId0、dataValue);

const uint32 arraySize = 3;
//const uint16 dataArray[arraySize]={0、0、0};//使用此行而不是下一行可修复编译器中的问题。
uint16 dataArray[arraySize]={0、0、0};

//使用错误的数据类型检索第一个元素应该失败。
SET (dataId0、dataArray);

/*
*==== main ====
*
int main()

RunTestCode();

/*
Task_Handle 任务;
ERROR_Block EB;

system_printf ("enter main()\n");

ERROR_INIT (&EB);
任务= Task_create (taskFxn、NULL、&EB);
if (task =NULL){
System_printf ("Task_create() failed!\n");
BIOS_exit (0);

*

//BIOS_start();/*不返回*/
返回(0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您正在使用哪些编译器选项? 您使用的编译器版本(与 CCS 版本不同)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    应该是最新的。 我在两天前下载了最新版本的 CCS 7.2。 以下是更多编译输出:

    ****为项目 TemplateTest2构建配置调试****

    "C:\\ti\\ccs720\\ccsv7\\utils\\bin\\gmake"-k -j 12 all -O
    正在制作./src/sysbios.ae674 ...
    gmake[1]:没有为"全部"执行任何操作。
    '生成文件:./main.cpp'
    '调用:C6000编译器'
    "c:/ti/ccs720/ccsv7/tools/compiler/c6000_7.4.22/bin/cl6x -mv6740 --abi=eabi -g --include_path="C:/Bently/CCS_7_2_Workspace/TemplateTest2 --include_path="C:/ti/ccs720/ccsv7/tools/compiler/c6000_7.4.22/include --define=C6748 --cmd_wrap=off --diag_warning=225 --display_error_number --preproc_with_compile --prepag_sup相关性="opt_sup相关性-config/proc/main.cpp。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它看起来确实是一个错误、但看起来该错误已在 C6000 8.x 编译器版本中修复。 我将需要将这一位推荐给有关该主题的专家。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    C++解析器在7.4.x 和8.x 之间升级、如注释所示、8.x 编译器现在按照您所期望的方式处理代码。 如果您可以升级到8.x、请考虑升级。 如果不是、则需要使用上面显示的解决方法。 我已提交 CodeGen-3568进行进一步分析。 但是、此错误不会具有高优先级、因为它似乎已经在8.x 中修复 如果这最终确实是一个错误、并且修复范围很广、则可能根本无法修复7.4.x。 很抱歉、我没有更明确的解决方法来解决此错误。