错误:'int'之前的预期主表达式(在接受数组的函数上下文中)

error: expected primary-expression before 'int' (In the context of a function that accepts arrays)

本文关键字:数组 上下文 函数 int 错误 表达式      更新时间:2023-10-16

我正在制作一个简单的控制台应用程序,该应用程序具有一个函数,该函数接受两个数组,一个数组具有一系列列宽,另一个数组为一系列字符串,然后cout的每个字符串添加空格,直到到达下一列。

我在columnizer函数的第一行得到了一个错误:error: expected primary-expression before 'int'。我尝试更改头文件和cpp文件中的声明,但没有成功。

这是相关代码:

//cashier.cpp
void columnizer(int sizes[], std::string values[]){
    int columnCount = (sizeof sizes) / (sizeof int);
    for (int i=0; i < columnCount; i++){
        string value = values[i];
        cout << value;
        char valueLength = sizeof value / sizeof char
        char extraSpace = columnSizes[i] - valueLength;
        while (extraSpace > 0){
            cout << " ";
            extraSpace--;
        }
    }
}

对columnizer的调用:

//cashier.cpp
int columnSizes[5] = {7, 15, 20, 9, 9};
string headers[5] = {"Qty","ISBN","Title","Price","Total"};
...
columnizer(columnSizes, headers);
...

头文件:

//cashier.h
int cashier();
void columnizer(int sizes[], std::string values[]);

此代码充满了问题:

  • 看起来像参数数组的东西实际上变成了指针
  • 一条语句后缺少分号
  • 同样的说法可能是不明智的:std::string s的长度是用s.size()来确定的
  • 名称使用不一致

这里有一种方法,你可以修补你的代码,避免明显的问题:

template <int N>
void columnizer(int (&sizes)[N], std::string (&values)[5]){
    for (int i=0; i < N; i++){
        std::string const& value = values[i];
        std::cout << value;
        char valueLength = value.size();
        char extraSpace = sizes[i] - valueLength;
        while (extraSpace > 0){
            std::cout << " ";
            extraSpace--;
        }
    }
}

关键的神奇之处在于可以将引用传递给数组。更有趣的是,当通过引用传递数组时,编译器可以推断出数组的大小,也就是说,不需要sizeof-破解。为了使交易更加甜蜜,编译器将验证传递的数组是否相同。

看起来您实际上想要打印列标题,但您的代码实际上并没有打印列名。请注意,您不需要手动填充。相反,您可以根据需要设置流以填充空白,例如

std::cout << ' ' << std::setw(sizes[i]) << values[i];

可以使用操纵器std::leftstd::right将输出放在任何填充的左侧或右侧(也可以使用std::internal将流填充放在值内,例如符号和值之间)。