相关疑难解决方法(0)

C在结构中初始化数组

我想在结构中包含一个可变长度数组,但是在正确初始化它时遇到了问题.

struct Grid {
  int rows;
  int cols;
  int grid[];
}

int main() {
  struct Grid testgrid = {1, 3, {4, 5, 6}};
}
Run Code Online (Sandbox Code Playgroud)

我尝试的一切都给了我一个'错误:灵活数组成员的非静态初始化'错误.

c struct

22
推荐指数
2
解决办法
5万
查看次数

成员变量中的类模板参数推导

扩展版在这里

我们可以创建具有默认模板参数的类模板对象,而无需键入尖括号:

int main()
{
    std::less a;
}
Run Code Online (Sandbox Code Playgroud)

但是对于成员变量我们不能这样做:

struct S
{
    std::less a; // I want only type std::less<void> here
};
Run Code Online (Sandbox Code Playgroud)

看起来第一种情况由于CTAD起作用,但为什么编译器不能std::less<void>在第二种情况下推断?也许我们不应该在那里应用 CTAD,而是提供不同的机制。

这是否被认为是标准中的错误?有没有修复它的建议?

我的用例:

我有一个提供默认参数的类模板,如下所示:

template <typename T = int>
class Foo {};
Run Code Online (Sandbox Code Playgroud)

模板参数是我自己从未使用过的专家专用功能,但它适用于那些想要完全灵活性的 1% 的专家。现在对于其他 99% 我想隐藏Foo实际上是类模板但它不起作用的事实,因为用户在将Foo<>其声明为成员变量时必须键入,当前的解决方案是:

template <typename T = int>
class BasicFoo {};

using Foo = BasicFoo<>;
Run Code Online (Sandbox Code Playgroud)

但它使实现代码复杂化,一点也不优雅。

c++ templates c++17

3
推荐指数
1
解决办法
483
查看次数

为什么int arr [] = {0,3,2,4,5,6,7};给出错误并且int arr [7] = {0,3,2,4,5,6,7}; 不

#include<iostream>
#include<stdio.h>
using namespace std;
class Test
{   
   private:
   int array[]={0,2,4,6,8,10,12};//this line is the root cause of the error but why ?   
   public :
   void compute();
};
void Test::compute()
{
    int result =0;
    for(int i=0;i<7;i++)
    {
        result += array[i];
    }
        cout<<result;
}
int main()
{
    Test obj;
    obj.compute();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我将int array[]上面的代码替换为,array[7]则程序将编译并运行并显示警告。

c++ arrays

0
推荐指数
1
解决办法
87
查看次数

标签 统计

c++ ×2

arrays ×1

c ×1

c++17 ×1

struct ×1

templates ×1