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

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

我正在制作一个简单的控制台应用程序,它有一个接受两个数组的函数,一个有一系列的列宽,另一个有一系列的字符串,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[]);

这段代码问题百出:

  • 看起来像参数 arrays 实际上变成了 _pointers
  • 一条语句后少了一个分号
  • 同样的说法很可能ill-advised: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--;
        }
    }
}

关键的魔力是您可以传递对数组的引用。更有趣的是,您可以让编译器在通过引用传递数组时 推导 数组的大小,即 no 需要 sizeof-破解。为了使交易更加甜蜜,编译器将验证传递的数组是否相同。

您似乎真的想打印列 headers 但您的代码实际上并没有打印列名。请注意,您 不需要 手动填充。相反,您可以根据需要将流设置为用空格填充,例如

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

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