3
下面的代码不能编译,为什么?我该如何解决这个问题?在“模板基类”中调用模板方法的错误
struct A{
template<int N> int get() { return N; }
};
template <typename X>
struct B : public X {
template<int N> int get() {
return X::get<N>();
}
};
int main(int argc, const char *argv[])
{
B<A> b;
return b.get<5>();
}
编译器错误:
test.cxx: In member function ‘int B<X>::get()’:
test.cxx:8:30: error: expected primary-expression before ‘)’ token
test.cxx: In member function ‘int B<X>::get() [with int N = 5, X = A]’:
test.cxx:15:25: instantiated from here
test.cxx:8:30: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘int’ to binary ‘operator<’
为什么有必要消除歧义? OP严格地调用'X :: get();' –
2012-01-06 08:21:44
@sad_man:在第一次传递期间没有实例化X,我们不知道'get'是成员模板。 'X :: get()'被解释为'X :: get less_than N greater_than()',这是一个错误。 –
visitor
2012-01-06 08:35:47
@sad_man:基本上C++规则不允许出现这样的情况,即相同的代码可能意味着对成员函数模板的调用和一系列比较,这取决于X的特化。(VC++错误,AFAIK。) – visitor 2012-01-06 08:41:08