从模板化类继承并调用模板化函数时出错

时间:2013-05-16 21:26:47

标签: c++ templates gcc

我有一些我正在修改的模板代码,我遇到了一个奇怪的错误,我无法解决。我能够使用下面更简单(但无可置疑的无意义)代码片段重新创建问题:

struct Widget
{
};

template <typename A>
class Foo
{
public:

    template <int numA>
    inline bool funcCall()
    {
        return numA > 0;
    }

    inline bool funcCallNoTemplate()
    {
        return false;
    }
};

template <typename B>
class Bar : public Foo<B>
{
public:

    // doesn't work
    bool concrete()
    {
        return Foo<B>::funcCall<5>();
    }

    // works fine
    bool other()
    {
        return Foo<B>::funcCallNoTemplate();
    }
};

int main()
{
    Bar<Widget> b;
    b.concrete();
    b.other();
    return 0;
}

我在GCC 4.7中遇到的错误如下(第30行是Bar :: concrete的主体):

example.cxx: In member function ‘bool Bar<B>::concrete()’:
example.cxx:30: error: expected primary-expression before ‘)’ token
example.cxx: In member function ‘bool Bar<B>::concrete() [with B = Widget]’:
example.cxx:43:   instantiated from here
example.cxx:30: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘int’ to binary ‘operator<’

似乎编译器甚至无法正确解析这个问题,我是否遗漏了一些使该行完全失真的内容?

1 个答案:

答案 0 :(得分:1)

  

似乎编译器甚至无法正确解析这个问题,我是否遗漏了一些使该行完全失真的内容?

是。您需要使用template消歧器:

return Foo<B>::template funcCall<5>();
//             ^^^^^^^^

这样,您将告诉编译器将依赖名称funcCall解析为成员函数模板的名称,并将后续的尖括号解析为相应模板参数的分隔符。

如果没有它,funcCall将被解析为数据成员的名称,而<>将被解析为少于和< em>大于。