我有一段简单的代码,它给了我一个编译器错误。我在 Visual Studio 下的 windows 环境中编译和运行它没有任何问题,但现在在 linux 下,使用 gcc,我遇到了问题。注意我正在使用 gcc 4.4.5 ,并使用 -std=c++0x 指令。

此代码片段位于头文件 file_handling.h 中,其中包含所有必需的库( vector 、字符串、fstream 等)。变量“output_file”是 LogFile 对象的成员,并在其他地方正确检查/实例化/等。代码本身非常简单,这就是我难倒的原因:

template <typename T> void LogFile::put(std::string const & header, std::vector<T> const & data) {

  output_file << header << " " << std::scientific << data[0] << std::endl;

  for (std::vector<T>::const_iterator value = (data.begin()+1); value < data.end(); ++value) {
           output_file << *value << std::endl;
  }

}

编译器指出:
In file included from file_handling.cpp:2:
file_handling.h: In member function 'void LogFile::put(const std::string&, const std::vector<T, std::allocator<_Tp1> >&)':
file_handling.h:132: error: expected ';' before 'value'
file_handling.h:132: error: 'value' was not declared in this scope
make: *** [file_handling.o] Error 1

为什么 gcc 没有将“值”的原位声明视为 const_iterator?我已经尝试了以下作为健全性检查:
template <typename T> void LogFile::put(std::string const & header, std::vector<T> const & data) {
  std::vector<T>::const_iterator value;
  output_file << header << " " << std::scientific << data[0] << std::endl;

  for (value = (data.begin()+1); value < data.end(); ++value) {
           output_file << *value << std::endl;
  }

}

并收到完全相同的编译器报告。鉴于这看起来很简单,并且在 Visual Studio 中运行良好,我对 gcc 和/或 Linux 环境有什么遗漏或误解?

最佳答案

正确的形式应该是:

template <typename T> void LogFile::put(std::string const & header, std::vector<T> const & data) {

  output_file << header << " " << std::scientific << data[0] << std::endl;

  for (typename std::vector<T>::const_iterator value = (data.cbegin()+1); value != data.cend(); ++value) {
           output_file << *value << std::endl;
  }

}

注意 typename 的添加,以及从 begin() 和 end() 到 cbegin() 和 cend() 的变化。

使用模板化类型时需要 typename。 begin() 和 end() 不适用于 const_iterators。

编辑:显然 begin() 和 end() 将返回 const_iterators。由于增加了清晰度和强制返回类型,我从来没有为此目的使用过它们,并且总是使用 cbegin() 和 cend()。我猜每个人都是他自己的。

注意:为简化起见,您可以使用 c++11 中的新 auto 关键字。
template <typename T> void LogFile::put(std::string const & header, std::vector<T> const & data) {

  output_file << header << " " << std::scientific << data[0] << std::endl;

  for (auto value = (data.cbegin()+1); value != data.cend(); ++value) {
           output_file << *value << std::endl;
  }

}

关于c++ - 在 Windows 上运行的 GCC 代码上的编译器错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12241507/

10-12 12:40
查看更多