我是C ++开发的新手,因为我在网上学习外部变量 - 我尝试将字符串变量及其工作正常。但我必须使用字符串变量,因为它不起作用。请看如下。
globals.h
#include <iostream>
using namespace std;
#ifndef SIMULATIONFILEPARSER_GLOBALS_H
#define SIMULATIONFILEPARSER_GLOBALS_H
//sequence of files to be execute
extern string ipFiles[];
#endif //SIMULATIONFILEPARSER_GLOBALS_H
globals.cpp
#include "../headers/globals.h"
//sequence of files to be execute
string ipFiles[] = {"in.relaxSubstrate", "in.relaxFluid"};
的main.cpp
#include <iostream>
#include "Source/headers/globals.h"
int main() {
for (string &ipFileName :ipFiles) {
std::cout << ipFileName << std::endl;
}
return 0;
}
当我尝试运行此项目时,它会出现以下错误
C:\Users\king\ClionProjects\SimulationFileParser\main.cpp: In function 'int main()':
C:\Users\king\ClionProjects\SimulationFileParser\main.cpp:5:30: error: range-based 'for' expression of type 'std::__cxx11::basic_string<char> []' has incomplete type
for (string &ipFileName :ipFiles) {
^
CMakeFiles\SimulationFileParser.dir\build.make:61: recipe for target 'CMakeFiles/SimulationFileParser.dir/main.cpp.obj' failed
mingw32-make.exe[3]: *** [CMakeFiles/SimulationFileParser.dir/main.cpp.obj] Error 1
mingw32-make.exe[3]: *** Waiting for unfinished jobs....
mingw32-make.exe[2]: *** [CMakeFiles/SimulationFileParser.dir/all] Error 2
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/SimulationFileParser.dir/all' failed
mingw32-make.exe[1]: *** [CMakeFiles/SimulationFileParser.dir/rule] Error 2
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/SimulationFileParser.dir/rule' failed
mingw32-make.exe: *** [SimulationFileParser] Error 2
Makefile:117: recipe for target 'SimulationFileParser' failed
答案 0 :(得分:0)
此循环不知道数组的大小。
for (string &ipFileName :ipFiles)
global.h中的更改
extern string ipFiles[2];
global.cpp中的更改
string ipFiles[2] = {"in.relaxSubstrate", "in.relaxFluid"};
在此之后,您的代码应该正确编译。
答案 1 :(得分:0)
编译器并没有抱怨一个不可见的符号。它告诉你,类型不完整:
基于范围&#39; for&#39;表达类型&#39; std :: __ cxx11 :: basic_string []&#39; 类型不完整
在编译器知道数组的大小之前,它无法编译基于范围的for循环。要更改此设置,您需要声明一个完整的类型。这可能是一个具有明确大小的数组,或者 - 这是推荐的解决方案 - 标准容器 1 :
<强> globals.h 强>
#pragma once
#include <string>
#include <vector>
extern std::vector<std::string> ipFiles;
<强> globals.cpp 强>
std::vector<std::string> ipFiles{"in.relaxSubstrate", "in.relaxFluid"};
您不必更改 main.cpp 。但是如果你想让它变得有趣,你可以使用auto
以及锻炼const正确性:
int main() {
for (const auto& ipFileName : ipFiles) {
std::cout << ipFileName << std::endl;
}
return 0;
}
<小时/> 1 在编译时不需要知道标准容器的大小。所有编译器需求都是受控序列的
begin()
和end()
的(前向)迭代器。另一方面,数组不提供这些作为成员函数,并且编译器需要生成它们。它需要知道大小以生成等效的end()
。