C++:转发模板成员函数调用失败
C++: forward a template member function call failed
假设我有一个模板 class TemplateClass
,模板函数 templFcn
如下:
template <typename T>
struct TemplateClass {
template <bool Bool> void templFcn(int i) { }
};
void test() {
TemplateClass<float> v;
v.templFcn<true>(0); // Compiles ok.
}
现在我想编写一个 forward
函数来模拟这种行为
template <typename T, template<typename> class C, bool Bool>
void forward(C<T>& v) {
v.templFcn<Bool>(0); // Compiler error, Line 16 (see below)
};
void test2() {
TemplateClass<float> v;
forward<float,TemplateClass,true>(v); // Line 21
}
clang++ 编译器错误:
test.cc:16:5: error: reference to non-static member function must be called
v.templFcn<Bool>(0);
~~^~~~~~~~
test.cc:21:3: note: in instantiation of function template specialization
'forward<float, TemplateClass, true>' requested here
forward<float,TemplateClass,true>(v);
^
test.cc:3:29: note: possible target for call
template <bool Bool> void templFcn(int i) { }
^
1 error generated.
谁能解释一下为什么在这种情况下这样的模板转发失败了?有什么办法可以规避它吗?谢谢!
v.template templFcn<Bool>(0); // Compiler error, Line 16 (see below)
从属子句需要消歧,所以它知道 <
是模板子句的开场白,而不是小于。
假设我有一个模板 class TemplateClass
,模板函数 templFcn
如下:
template <typename T>
struct TemplateClass {
template <bool Bool> void templFcn(int i) { }
};
void test() {
TemplateClass<float> v;
v.templFcn<true>(0); // Compiles ok.
}
现在我想编写一个 forward
函数来模拟这种行为
template <typename T, template<typename> class C, bool Bool>
void forward(C<T>& v) {
v.templFcn<Bool>(0); // Compiler error, Line 16 (see below)
};
void test2() {
TemplateClass<float> v;
forward<float,TemplateClass,true>(v); // Line 21
}
clang++ 编译器错误:
test.cc:16:5: error: reference to non-static member function must be called
v.templFcn<Bool>(0);
~~^~~~~~~~
test.cc:21:3: note: in instantiation of function template specialization
'forward<float, TemplateClass, true>' requested here
forward<float,TemplateClass,true>(v);
^
test.cc:3:29: note: possible target for call
template <bool Bool> void templFcn(int i) { }
^
1 error generated.
谁能解释一下为什么在这种情况下这样的模板转发失败了?有什么办法可以规避它吗?谢谢!
v.template templFcn<Bool>(0); // Compiler error, Line 16 (see below)
从属子句需要消歧,所以它知道 <
是模板子句的开场白,而不是小于。