在"模板化基类"中调用模板方法时出错

All*_*lan 3 c++ inheritance templates generic-programming

以下代码无法编译,为什么会这样?我该如何解决这个问题?

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>();
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

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<’
Run Code Online (Sandbox Code Playgroud)

jus*_*tin 5

你必须消除它的歧义,如下:

template<int N>int get() {
    return X::template get<N>();
}
Run Code Online (Sandbox Code Playgroud)

  • @sad_man:在第一次传递期间没有实例化X,我们不知道`get`是一个成员模板.`X :: get <N>()`被解释为`X :: get less_than N greater_than()`这是一个错误. (5认同)
  • @sad_man:基本上C++规则不允许这样的情况,即相同的代码可能意味着对成员函数模板的调用和一系列的比较,这取决于X的特化.(VC++弄错了,AFAIK.) (4认同)