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);
}