繁体   English   中英

定义外部成员模板功能

[英]Defining out-of-line member template functions

考虑这个(最小化)示例:

template <typename Descriptor>
class hash_table
{
public:
  typedef int value_type;

  template <typename Argument, int Callback (value_type *, Argument)>
  void traverse (Argument);

  template <int Callback (value_type *)>
  void traverse_void ();
};

我定义了一个类模板,它具有带非类型参数的模板成员函数。 请注意, Callback取决于value_type typedef。 现在我想定义函数本身:

template <typename Descriptor>
template <typename Argument, int Callback (typename hash_table <Descriptor>::value_type *, Argument)>
void hash_table <Descriptor>::traverse (Argument) {}

template <typename Descriptor>
template <int Callback (typename hash_table <Descriptor>::value_type *)>
void hash_table <Descriptor>::traverse_void () {}

我从编译器中得到了不一致的错误。 结果不依赖于选项,指定C ++标准的版本(即C ++ 98,C ++ 11和C ++ 14的版本),但取决于编译器。

GCC 6.0.0(最近的主干,以及其他几个版本)接受此代码。

Clang 3.7.0(最近的trunk)给出以下错误:

test.cc:18:31: error: out-of-line definition of 'traverse_void' does not match any declaration in 'hash_table<Descriptor>'
void hash_table <Descriptor>::traverse_void() {}
                              ^~~~~~~~~~~~~
1 error generated.

EDG(英特尔C ++编译器v.15.0.3)给出了两个错误:

test.cc(15): error: declaration is incompatible with function template "void hash_table<Descriptor>::traverse<Argument,Callback>(Argument)" (declared at line 7)
  void hash_table <Descriptor>::traverse (Argument) {}
                                ^

test.cc(19): error: declaration is incompatible with function template "void hash_table<Descriptor>::traverse_void<Callback>()" (declared at line 10)
  void hash_table <Descriptor>::traverse_void () {}
                                ^
compilation aborted for test.cc (code 2)

什么是预期的行为(根据标准)? 如果代码错误,我该如何修复函数定义?

你的代码看起来很好,我认为没有理由不编译。 可能是禁止它的编译器的错误。 但是,因为[temp.param]:

将类型为“ T of T ”或“函数返回T ”的非类型模板参数分别调整为“指向T指针”或“指向函数返回T指针”。

您可以简单地将Callback切换为指向函数的指针。 这种行为在所有方面都是相同的,这个代码也可以在clang上编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM