【问题标题】:problem with const reference return and STL vectorsconst 引用返回和 STL 向量的问题
【发布时间】:2011-06-30 05:52:55
【问题描述】:

我在使用以下 sn-p 代码时遇到问题

    string const& symbol::at(int index) const {
    assert(index<symbol_data.vector::size());
    return symbol_data.vector::at(index);
    }

这里,symbol_data 是类的私有成员,是一个向量

::at 是我定义的符号类中的成员函数。

当我尝试编译此代码时,我收到以下错误消息:

    error: ‘template<class _Tp, class _Alloc> class std::vector’ used without template parameters

但是,如果我将函数原型更改为

    string symbol::at(int index) {...}

有人知道如何让 STL 向量与 const 引用一起正常工作吗?

【问题讨论】:

  • 能否发一个完整的可以独立编译的例子? (最好是尽可能小的例子)

标签: c++ stl vector reference constants


【解决方案1】:

我正在写的代码:

string const& symbol::at(int index) const {
    assert(index<symbol_data.vector::size());
    return symbol_data.vector::at(index);
    }

只写symbol_data.,而不是symbol_data.vector::

干杯,

【讨论】:

  • 我是这么想的,但是我笔记本上的所有编译器都接受symbol_data.vector::at(index);...
  • @James:嗯。你能发布一个完整的例子吗?
  • int main() { std::vector&lt;int&gt;().vector::begin(); } Clang 3.0/133044、Visual C++ 2010 SP1 和 g++ 4.5.1 都接受这一点(当然是#include &lt;vector&gt;)。我很惊讶!
  • 这成功了,让代码编译。你能解释一下这背后发生了什么吗?由于我在自定义类中重复使用 ::at 和 ::size,我不需要 vector:: 来解析范围吗?
  • 哦。它也与 Comeau Online 一起编译。这并不奇怪,因为在vector 类模板定义中,我认为它的成员函数定义可以不合格地引用vector。而且我认为名称查找是相同的。但这使OP的问题更加神秘。我想我们将不得不等待更完整的代码......
【解决方案2】:

我无法重现您的问题;以下在 VS2010 express 上编译并运行良好。

#include <cassert>
#include <iostream>
#include <string>
#include <vector>

class symbol 
{
  std::vector<std::string> symbol_data;

public:
  symbol()
  {
    symbol_data.push_back( "Str1" );
    symbol_data.push_back( "Str2" );
  }

  std::string const& at( int index ) const 
  {
    assert( index < symbol_data.vector::size() );

    return symbol_data.vector::at( index );
  }
};

int main()
{
  symbol s;

  std::cout << s.at( 0 ) << std::endl;
  std::cin.get();

  return 0;
}

【讨论】:

  • 是的,这或多或少是我完整代码的样子。删除 vector:: 后,它可以正常编译,但不会按照您编写的方式编译。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多