7

下面给出的示例代码未在 g++ 中编译。但它正在视觉工作室工作。是否可以在g ++中的模板类中使用模板成员函数

class Impl
{
public:
        template<class I>
        void Foo(I* i)
        {

        }
};

template<class C>
class D
{
public:
        C c;
        void Bar()
        {
                int t = 0;
                c.Foo<int>(&t);
        }
};

int main()
{
        D<Impl> d;
        d.Bar();
        return 0;
}
4

2 回答 2

9

C因为所讨论的语句取决于模板参数,所以编译器在实例化之前不允许自省。你必须告诉它你的意思是一个函数模板:

c.template Foo<int>(&t);

如果您不放在template那里,则该陈述是模棱两可的。为了理解,想象以下内容C

class C { const int Foo = 5; }; 
...
c.Foo<int>(&t);

在编译器看来,就好像您将 aconst int与 anint进行比较,并将其结果与 : 的某个地址进行&t比较(c.Foo<int) > &t

然而,真正的解决方案是在函数调用中省略显式模板参数,只需执行以下操作:

c.Foo(&t);

即使在这样的 aC具有非模板成员函数的情况下也是正确的Foo(int)。通常,编写模板代码时要尽可能少地假设(但不能少)。

于 2012-04-17T07:44:36.727 回答
4

Foo()是一个依赖于模板的名字,所以需要template在调用前面放:

template<class C>
void D<C>::Bar()
{
    int t = 0;
    c.template Foo(&t);
}
于 2012-04-17T07:40:59.973 回答