2012-01-06 127 views
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<’ 

回答

5

必须消除歧义它,就像这样:

template<int N>int get() { 
    return X::template get<N>(); 
} 
+0

为什么有必要消除歧义? OP严格地调用'X :: get ();' – 2012-01-06 08:21:44

+5

@sad_man:在第一次传递期间没有实例化X,我们不知道'get'是成员模板。 'X :: get ()'被解释为'X :: get less_than N greater_than()',这是一个错误。 – visitor 2012-01-06 08:35:47

+4

@sad_man:基本上C++规则不允许出现这样的情况,即相同的代码可能意味着对成员函数模板的调用和一系列比较,这取决于X的特化。(VC++错误,AFAIK。) – visitor 2012-01-06 08:41:08