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::left
和 std::right
将输出放在任何填充的左侧或右侧(您也可以使用 std::internal
将流填充放在其中值,例如在符号和值之间)。
我正在制作一个简单的控制台应用程序,它有一个接受两个数组的函数,一个有一系列的列宽,另一个有一系列的字符串,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::left
和 std::right
将输出放在任何填充的左侧或右侧(您也可以使用 std::internal
将流填充放在其中值,例如在符号和值之间)。