gpt4 book ai didi

c++ - 为什么这段代码不能在 g++ 中编译

转载 作者:可可西里 更新时间:2023-11-01 18:20:50 25 4
gpt4 key购买 nike

下面给出的示例代码不是用 g++ 编译的。但它在 Visual Studio 工作。是否可以在 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;
}

最佳答案

因为有问题的语句依赖于模板参数,编译器不允许内省(introspection)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) .通常,在编写模板代码时尽可能少(但不能少)假设。

关于c++ - 为什么这段代码不能在 g++ 中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10187082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com