没有匹配的call / Candidate函数需要1个参数,0提供

时间:2015-03-20 03:02:13

标签: c++

首先,我是C ++编码的初学者,所以如果可能的话,尝试用最简单的术语解释事情,这样我就可以做出正面或反面。

我做了很多研究,但大多数例子对我没有任何意义。我尝试过实现各种解决方案,但我要么得到同样的错误,要么让事情变得更糟。

该程序应该能够接受一串罗马数字,并将它们转换为整数值。由于这是一项家庭作业,我必须在Roman_int类中完成所有这一切,并通过班级中的成员函数执行操作。

我创建的程序包含一个名为as_int()的成员函数,它将一串罗马数字转换为数字整数值。据我所知,这部分工作正常。

另外需要注意的是,我正在使用我大学提供的特殊标题,它处理诸如使用std库之类的东西,所以事情可能看起来有点奇怪。

以下是我所拥有的:

#include "std_lib_facilities_4.h"
/* 
M=1000
D=500
C=100
L=50
X=10
V=5
I=1
*/

class Roman_int
{
    string r;

 public:
    int as_int()
    {
        int val;
        for(int i=r.size()-1; i>0; --i)
        {
            if(i==r.size()-1)
            {
                switch(r[i])
                {
                    case 'M':
                        val+=1000;
                        break;
                    case 'D':
                        val+=500;
                        break;
                    case 'C':
                        val+=100;
                        break;
                    case 'L':
                        val+=50;
                        break;
                    case 'X':
                        val+=10;
                        break;
                    case 'V':
                        val+=5;
                        break;
                    case 'I':
                        val+=1;
                        break;
                    default:
                        error("invalid input");
                        break;
                }
            }
            else
            {
                switch(r[i])
                {
                    case 'M':
                        val+=1000;
                        break;
                    case 'D':
                        if(r[i+1]== 'M')
                            val-=500;
                        else
                            val+=500;
                            break;
                    case 'C':
                        if(r[i+1]== 'M' || r[i+1]== 'D')
                            val-=100;
                        else
                            val+=100;
                            break;
                    case 'L':
                        if(r[i+1]== 'M' || r[i+1]== 'D' || r[i+1]== 'C')
                            val-=50;
                        else
                            val+=50;
                            break;
                    case 'X':
                        if(r[i+1]== 'M' || r[i+1]== 'D' || r[i+1]== 'C' || r[i+1]== 'L')
                            val-=10;
                        else
                            val+=10;
                            break;
                    case 'V':
                        if(r[i+1]== 'M' || r[i+1]== 'D' || r[i+1]== 'C' || r[i+1]== 'L'  || r[i+1]== 'X')
                            val-=5;
                        else
                            val+=5;
                            break;
                    case 'I':
                        if(r[i+1]== 'I')
                            val+=1;
                        else
                            val-=1;
                        break;
                    default:
                        error("invalid input");
                        break;
                }
            }
        }
        return val;
    }

    friend istream& operator>>(istream& is, Roman_int& roman)
    {
        string rom_num;
        is >> rom_num;
        if(!is) return is;
        roman = Roman_int(rom_num);
        return is;
    }

    friend ostream& operator<<(ostream& os, Roman_int& roman)
    {
        cout << roman.r << endl;
        return os;
    }

};



int main()
{
    Roman_int r;
    cout << "Enter a Roman numeral in all capital letters: " << endl;
    cin >> r;
    cout << "Roman " << r << " equals " << r.as_int() << endl;
}

我遇到的问题是在我的main函数中声明我的Roman_int对象。我之前遇到了类似的错误:

hw6_pr3.cpp: In function ‘std::istream& operator>>(std::istream&, Roman_int&)’:
hw6_pr3.cpp:114:28: error: no matching function for call to ‘Roman_int::Roman_int(String&)’
   roman = Roman_int(rom_num);
                            ^
hw6_pr3.cpp:114:28: note: candidates are:
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int()
 class Roman_int
       ^
hw6_pr3.cpp:17:7: note:   candidate expects 0 arguments, 1 provided
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int(const Roman_int&)
hw6_pr3.cpp:17:7: note:   no known conversion for argument 1 from ‘String’ to ‘const Roman_int&’
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int(Roman_int&&)
hw6_pr3.cpp:17:7: note:   no known conversion for argument 1 from ‘String’ to ‘Roman_int&&’

根据我的阅读,我非常确定它与默认构造函数或我的类是如何初始化有关,但我不知道我应该从哪里去,因为我从来没有遇到过我创建的任何类的这类问题。如果有人能用简单的术语解释这一点,那将非常有帮助。


编辑:我在Roman_int类中添加了一个构造函数:

Roman_int(const string& r) : r(r) {}

但是我在主函数中调用Roman_int r;时仍然出错。这是新的错误消息:

    hw6_pr3.cpp: In function ‘int main()’:
hw6_pr3.cpp:131:12: error: no matching function for call to ‘Roman_int::Roman_int()’
  Roman_int r;
            ^
hw6_pr3.cpp:131:12: note: candidates are:
hw6_pr3.cpp:124:2: note: Roman_int::Roman_int(const String&)
  Roman_int(const string& r) : r(r) { }
  ^
hw6_pr3.cpp:124:2: note:   candidate expects 1 argument, 0 provided
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int(const Roman_int&)
 class Roman_int
       ^
hw6_pr3.cpp:17:7: note:   candidate expects 1 argument, 0 provided
hw6_pr3.cpp:17:7: note: Roman_int::Roman_int(Roman_int&&)
hw6_pr3.cpp:17:7: note:   candidate expects 1 argument, 0 provided

1 个答案:

答案 0 :(得分:2)

string rom_num;
roman = Roman_int(rom_num);

这需要在某处实现Roman_int::Roman_int(const std::string& argument)。您正在调用一个对于该类不存在的构造函数。

在定义中实现它:

Roman_int(const std::string& r) : r(r) { }