gpt4 book ai didi

c++ - GCC 5 的模板参数阴影

转载 作者:行者123 更新时间:2023-11-30 02:24:39 26 4
gpt4 key购买 nike

我(非常)惊讶地发现以下代码无法使用 CGG 5 或更低版本进行编译,尽管它在 clang 4 或 CGG 6(及更高版本)下运行起来非常棒。

我真的看不出出了什么问题,以及它隐藏了类 B 的模板参数。更重要的是,我不知道我应该如何调整它以便它可以与旧版本的 GCC 一起编译...

#include <array>

template <typename T, int N>
struct A {
public:
std::array<T, 3> coordinates = { };
};

template <typename T, int N>
class B {
public:
A<T, N> *myA = new A<T, N>();
};

编译器输出:

<source>:12:29: error: expected ';' at end of member declaration
A<T, N> *myA = new A<T, N>();
^
<source>:12:29: error: declaration of 'A<T, N> B<T, N>::N'
<source>:9:23: error: shadows template parm 'int N'
template <typename T, int N>
^
<source>:12:30: error: expected unqualified-id before '>' token
A<T, N> *myA = new A<T, N>();
^
<source>:12:26: error: wrong number of template arguments (1, should be 2)
A<T, N> *myA = new A<T, N>();
^
<source>:4:8: error: provided for 'template<class T, int N> struct A'
struct A {
^
Compiler exited with result code 1

最佳答案

is a GCC5 bug .您可以通过多种方式解决它。正如 in the comments 所指出的,最简单的可能是在新表达式周围添加括号。 :

template <typename T, int N>
class B {
public:
A<T, N> *myA = (new A<T, N> ());
};

另一种方法,如果您经常使用该类型,这可能是一个好主意,那就是添加 using a_type = A<T, N>;上课,然后说new a_type :

template <typename T, int N>
class B {
private:
using a_type = A<T, N>;
public:
A<T, N> *myA = new a_type();
};

虽然好像没必要,但还是加了一个main确保模板实例化的功能,以防影响错误:

int main() {
B<int, 5> b1, b2;
b1.myA->coordinates = {{1, 2, 3}};
return b2.myA->coordinates.size();
}

此外,我假设这些只是制作一个最小示例的工件,但为了以防万一,还有几点:

  • 你的 class B有内存泄漏:它从不delete这是它的指针 new s.
  • 根据编码风格,如果变量具有复杂的初始化,则在构造函数中初始化变量可能更符合习惯,除非它应该是静态的。
  • 根据您向我们展示的内容,class B 中的指针是不必要的间接级别,A (或只是 std::array )应该是直接成员。

关于c++ - GCC 5 的模板参数阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45170743/

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