Mik*_*sev 7 c++ templates member-functions language-lawyer
考虑这个(最小化)示例:
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 ();
};
Run Code Online (Sandbox Code Playgroud)
我定义了一个类模板,它具有带非类型参数的模板成员函数.请注意,这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 () {}
Run Code Online (Sandbox Code Playgroud)
我从编译器中得到了不一致的错误.结果不依赖于选项,指定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.
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
什么是预期的行为(根据标准)?如果代码错误,我该如何修复函数定义?
你的代码对我来说看起来很好,我认为它没有理由不编译。可能是编译器上的错误不允许它。但是,由于 [temp.param]:
\n\n\n\n\n\xe2\x80\x9c 类型的非类型模板参数
\nT
\xe2\x80\x9d 或 \xe2\x80\x9c 返回T
\xe2\x80\x9d 的函数调整为类型\n \xe2\x80\x9cpointer分别指向T
\xe2\x80\x9d 或 \xe2\x80\x9c 函数返回T
\xe2\x80\x9d 的指针。
您可以简单地将Callback
自己切换为函数指针。该行为在所有方面都是相同的,还有一个额外的好处是该代码也可以在 clang 上编译。
归档时间: |
|
查看次数: |
565 次 |
最近记录: |