未在范围错误中声明

时间:2015-07-12 06:56:52

标签: c++

我有一个保存学生数据的课程。在存储之前,如果有效,将首先检查ID。在重载运算符>>时,我调用了validate_id函数。我已经宣布它是一个朋友,但是在编译时,它说'validate_id was not declared in scope。是因为它是一个静态函数吗?

#include <iostream>
#include <string>
#include <locale>  
#include <utility>
#include <algorithm>
#include <stdexcept>


typedef std::pair<std::string, std::string> Name;

class Student {

   public:
       Student(){};

       bool operator <( const Student& rhs ) const {
          return ( id_ < rhs.id_ );
        }

   friend std::ostream& operator <<(std::ostream& os, const Student& s);
   friend std::istream& operator >>(std::istream& is, Student& s);

   private:
    std::string     id_;
    Name        name_;

    static bool validate_id(const std::string& id){
        if(id.length() != 9 && id[0] != 'a')
            return false;

        for(size_t i = 1, sz = id.length(); i < sz; i++){
            if(!isdigit(id[i]))
              return false;
        }

            return true;
    }

};


std::ostream& operator <<(std::ostream& os, const Student& s){
    return os << s.id_ << " " << s.name_.first << " " << s.name_.second;
}

std::istream& operator >>(std::istream& is, Student& s){
     is >> s.id_ >> s.name_.first >> s.name_.second;

    if(!validate_id(s.id_))  // error here, says validate_id is not in scope
        throw std::invalid_argument( "invalid ID" );


    return is;
}

3 个答案:

答案 0 :(得分:3)

validate_idStudent的静态成员,因此您需要使用类的范围来命名它:

if(!Student::validate_id(s.id_))
    ^^^^^^^^^

答案 1 :(得分:0)

在c ++中调用静态成员函数时,必须使用类作用域调用它。这意味着你必须使用  !Student::validate_id(s_id)

静态的含义是你声明的是进入类范围。不是对象范围。这就是为什么你必须在班上打电话的原因。

答案 2 :(得分:-1)

validate_id课程之外声明Student或致电Student.validate_id