【问题标题】:No matching function for call to 'ANDingOctets'调用“ANDingOctets”没有匹配的函数
【发布时间】:2014-03-12 15:49:02
【问题描述】:

我收到错误“由于某种原因,没有匹配函数调用 'ANDingOctets',想帮助我理解为什么?该函数对我来说看起来不错...(它不是完整的功能虽然还没有。)

//
//  ANDingOctets.cpp
//  Egetskojs
//
//  Created by Axel Kennedal on 2014-02-12.
//  Copyright (c) 2014 Axel Kennedal. All rights reserved.
//

#include <iostream>
#include <string>
using namespace std;

string ANDingOctets(string octetIP, string & octetSubNet);

int main(){

    /* EXAMPLE ADDRESSES
    string IPaddress = "192.168.0.12";
    string subNetMask = "255.255.255.0";*/

    string netID = ANDingOctets("10110110","11111000");
    cout << netID << endl;

    return 0;
}

string ANDingOctets(string octetIP, string & octetSubNet){
    int subNetBits;


    for (char index = 0; index < 8; index++) {
        if (octetSubNet.at(index) == '1') {
            subNetBits++;
        }
        else break;
    }
    cout << subNetBits << endl;
    return "test";
}

【问题讨论】:

    标签: c++ function syntax-error call


    【解决方案1】:

    在这种需要通过引用传递字符串的情况下,您不能使用字符串文字。你可以改变

    string netID = ANDingOctets("10110110", "11111000");
    

    string tmp = "11111000";
    string netID = ANDingOctets("10110110", tmp);
    

    另外,int subNetBits;是不用初始化的,你最好改成:

    int subNetBits = 0;
    

    【讨论】:

      【解决方案2】:

      尝试:

      string myString("11111000");
      string netID = ANDingOctets("10110110", myString);
      

      在您的解决方案中,您有一个常量字符串,即不是对字符串的引用,这是行不通的。

      可能会更好的方法是将两个参数作为 const 引用

      string ANDingOctets(const string &octetIP, const string &octetSubNet);
      
      // usage:
      string netID = ANDingOctets("10110110","11111000");
      

      【讨论】:

        【解决方案3】:

        ANDingOctets() 函数将字符串 reference 作为其第二个参数。您不能将文字字符串值作为非常量 std::string 引用传递。

        当我用 gcc 编译它时,我得到这个警告:

        test.cpp: In function ‘int main()’:
        test.cpp:21: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘const char*’
        test.cpp:13: error: in passing argument 2 of ‘std::string ANDingOctets(std::string, std::string&)’
        

        【讨论】:

        • “文字字符串”是什么意思?那么我应该怎么做才能修复它呢?感谢您的帮助:)!
        • @AxelKennedal-TechTutor 标记"11111000" 是字符串文字(不是std::string)。由于该函数需要后者,并且std::string 有一个采用const char * 的构造函数,因此编译器会使用您的文字作为参数隐式构造一个临时std::string 对象。但是,临时对象不能作为非常量引用传递。编译器假定该函数可能会修改参数,这是没有意义的,因为它是一个临时对象,在调用完成时会超出范围。如果您将其设为const 引用,它将起作用。
        【解决方案4】:

        第二个参数是引用:

        string ANDingOctets(string octetIP, string & octetSubNet);
                                                   ^
        

        你不能通过非常量引用传递一个临时字符串——这是一个有点古怪的语言规则,旨在防止你不小心修改了错误的东西。

        如果函数不打算修改参数,则按值(如第一个参数)或常量引用(const string &amp;)传递。

        如果它打算修改它(似乎并非如此),那么您需要传递一个非临时变量:

        string subnet = "11111000";
        string netID = ANDingOctets("10110110",subnet);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-16
          • 1970-01-01
          • 2021-09-21
          • 2016-11-23
          • 2016-08-08
          • 2015-03-17
          • 2018-08-04
          • 2012-05-27
          相关资源
          最近更新 更多