获取构造函数的初始化错误

时间:2015-09-22 03:49:32

标签: c++ c++11 constructor namespaces

这是我的process.cpp

#include<iostream>
  #include "process.h"
  #include "CString.h"
   void process(const char* s){
    w1::Cstring cs(s);
    std::cout << cs;
   }

我的CString.h

#ifndef _CSTRING_H
#define _CSTRING_H
#include<iostream>
namespace w1{
const int CHAR_NUM=3;
class Cstring{
public:
    char str[CHAR_NUM+1];
    Cstring(char* s);
    void display(std::ostream& os) const;

};
std::ostream& operator<<(std::ostream&os ,const Cstring& cs);
}
#endif

这是我的CString.cpp

#include <iostream>
#include "CString.h"
namespace w1{
Cstring::Cstring(char* s){
    if (s=='\0'){
        str[0]='\0';
    }else{
        for (int i=0;i<CHAR_NUM;i++){
            str[i]=s[i];
            str[i+1]='\0';
        }
    }
}
void Cstring::display(std::ostream& os) const{
    os<<str<<std::endl;
}

std::ostream& operator<<(std::ostream&os ,const Cstring& cs){
    cs.display(os);
    return os;
}
}

我收到一条错误,说我在process.cpp中没有任何匹配的构造函数来初始化w1 :: CString 我不知道如何纠正它。

2 个答案:

答案 0 :(得分:4)

您将构造函数Cstring(char* s);编写为非const指针。但是你的函数void process(const char* s)试图传递一个const指针。编译器不会自动抛弃constness(并且有充分的理由)。

但是,由于该构造函数似乎没有修改其参数,您应该将其更改为const指针:

Cstring(const char* s);

因此该错误将得到解决。

答案 1 :(得分:1)

我建议将构造函数的参数类型更改为const char *,如果构造函数不修改参数,就像在代码中一样。允许编译器将非const隐式转换为const,但不能反过来,如代码所示。