将模板化参数存储到命名空间中

时间:2015-10-20 16:31:20

标签: c++ templates namespaces

我想将模板化参数存储到我的命名空间中。

我不知道该怎么做。这是我的代码的简化:

<?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”不是函数或静态数据成员

我怎么能这样做?

2 个答案:

答案 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>