下面给出的示例代码不是用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;
}
答案 0 :(得分:9)
因为有问题的语句取决于模板参数,所以在实例化之前不允许编译器内省C
。你必须告诉它你的意思是一个功能模板:
c.template Foo<int>(&t);
如果你没有把template
放在那里,那么这个陈述是模棱两可的。为了便于理解,请想象以下C
:
class C { const int Foo = 5; };
...
c.Foo<int>(&t);
它将编译器看作是将const int
与int
进行比较,并将其结果与&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);
}