在下面的代码中,我有一个名为zipcode
的类模板,它有一个名为get_postbox
的成员函数模板。它汇编在海湾合作委员会,但不是在第3.9条。为什么没有接受这个代码呢?
在clang中我收到此错误:
<source>:34:41: error: expected expression
return my_postoffice.get_postbox<K>();
^
此外,从名为zipcode::get_postbox
的非成员功能模板调用相同的代码(与non_member_function_template()
相同)不会导致错误!
要亲自查看并使用它,请参阅编译器资源管理器中的代码:https://godbolt.org/g/MpYzGP
以下是代码:
template <int K>
struct postbox
{
int val() const
{
return K;
}
};
template <int A, int B, int C>
struct postoffice
{
postbox<A> _a;
template<int I>
postbox<I> get_postbox()
{
switch( I )
{
case A: return _a;
}
}
};
template <typename PO>
struct zipcode
{
PO my_postoffice;
template<int K>
postbox<K> get_postbox()
{
// The error is on this line
return my_postoffice.get_postbox<K>();
}
};
// Here's a function template that isn't a member, and it compiles.
template<int D>
int non_member_function_template()
{
postoffice<123,345,678> po;
auto box = po.get_postbox<D>();
return box.val();
}
int test_main()
{
return non_member_function_template<123>();
}
答案 0 :(得分:1)
使用模板成员函数时需要使用template关键字:
po.template get_postbox<D>()
和
while (($line = fgets($currentfile)) !== false) {
$bom = pack('H*','EFBBBF');
$line = preg_replace("/^$bom/", '', $line);
$n = sscanf($line, "%d|%d|%[^|]|%[^\n]", $a, $b, $c, $d);
print "<tr><td>$a</td><td>$b</td><td>$c</td></tr>";
}
c.f。这里:http://ideone.com/W0owY1代码 在这里:Where and why do I have to put the "template" and "typename" keywords?获取何时使用模板关键字
的确切说明