为什么这段代码不能用g ++编译

时间:2012-04-17 07:36:39

标签: c++ templates g++

下面给出的示例代码不是用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;
}

2 个答案:

答案 0 :(得分:9)

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

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

如果你没有把template放在那里,那么这个陈述是模棱两可的。为了便于理解,请想象以下C

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

它将编译器看作是将const intint进行比较,并将其结果与&t (c.Foo<int) > &t的某些地址进行比较。

真正的解决方案但是在函数调用中省略显式模板参数,只需执行:

c.Foo(&t);

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

答案 1 :(得分:4)

Foo()是一个依赖于模板的名称,因此您需要将template放在调用前面:

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