我想将模板化参数存储到我的命名空间中。
我不知道该怎么做。这是我的代码的简化:
<?xml version="1.0" encoding="UTF-8"?>
<table>
<row>
<Date>2015-10-14</Date>
<Hospital>OLVG</Hospital>
<ID>1</ID>
<VisitType>Handover</VisitType>
<Specialisation>SYS1</Specialisation>
<ContactName>Nick</ContactName>
<ContactTel>0365425653</ContactTel>
<ContactMail>Nick@new.nl</ContactMail>
<ShortText>Dit is een test</ShortText>
<Actions>Geen verdere acties nodig</Actions>
</row>
</table>
我收到错误:
错误:“last_o”不是函数或静态数据成员
我怎么能这样做?
答案 0 :(得分:3)
而不是给定的无效代码
namespace sdc {
template<typename T_output>
T_output last_o[dim_output];
template<typename T_input, typename T_output>
void training(T_input in[], T_output o_a[], T_output o_b[]) {
sdc::last_o = o_a;
}
}
...你可以使用简单的迈耶斯&#39;单身std::vector
,如下:
#include <vector>
namespace sdc {
using std::vector;
template< class Type >
auto last()
-> vector<Type>&
{
static vector<Type> the_last;
return the_last;
}
template< class Input, class Output>
void training( vector<Input>& in, Vector<Output> a, Vector<Output> b )
{
sdc::last<Output>() = a;
}
} // namespace sdc
请注意,这会为每种类型sdc::last()
维护一个单独的Output
。
如果您想要所有类型的共同历史记录,则必须更详细地指定您打算如何访问它。
免责声明:编译人员未触及的代码。
如@vsoftco in commentary所述,他可以通过使用C ++ 14模板化变量来避免单例,与原始代码完全相同,除非使用例如一个std::vector
而不是原始数组,因为原始数组不可分配。但出于两个原因,这样做是一个普遍的惯例。首先,臭名昭着的“static initialization order fiasco” pitfall会在你最不期望的时候陷入困境。其次,并非所有代码读者都知道现在支持语法 - 目前包括并非所有编译器都会知道它。
答案 1 :(得分:1)
问题在于作业
sdc::last_o = o_a;
你不能分配给一个数组(std:: last_o
是一个数组,数组不是指针,它们在作为函数参数传递时会衰减为指针)。除了代码应该工作之外,假设dim_output
是一个常量表达式。
在任何情况下,sdc::last_o
都是变量模板(在C ++ 14中引入),因此它应该是std::last_o<TYPE>
。