编写我自己的字符串类"reference to ‘string’ is ambiguous"但出现编译错误

Writing my own string class but getting "reference to ‘string’ is ambiguous" compilation error

本文关键字:ambiguous is 错误 编译 string 自己的 我自己 字符串 to reference      更新时间:2023-10-16

我正在尝试编写自己的字符串类(为了理解目的)。我把它写如下,文件1字符串.h

#include<iostream>
#include<string.h>
namespace MyString
{
class string
{
char* ch;
int len;
public:
string();
string(const char* ch);
char* getString();
int length();
};
}

文件2字符串.cpp

#include<iostream>
#include"string.h"
using namespace std;
using MyString::string; // use string from MyString namespace only.
string::string()
{                       
ch = NULL;      
len = 0;
}                     
string::string(const char* ch)
{                       
this->ch = ch;  
}   
char* string::getString()
{
return ch;
}
int string::length()
{
return len;
}
int main()
{
string obj = "This is a test";
cout << obj.getstring<<endl;
return 0;
}

但我的程序甚至无法编译,出现以下错误

g++     string.cpp   -o string
string.cpp:6:1: error: reference to ‘string’ is ambiguous
string.h:5:8: error: candidates are: class MyString::string
/usr/include/c++/4.6/bits/stringfwd.h:65:33: error:                 typedef struct std::basic_string<char> std::string
string.cpp:6:1: error: ‘string’ does not name a type
string.cpp:12:1: error: reference to ‘string’ is ambiguous
string.h:5:8: error: candidates are: class MyString::string
/usr/include/c++/4.6/bits/stringfwd.h:65:33: error:                 typedef struct std::basic_string<char> std::string
string.cpp:12:1: error: ‘string’ does not name a type
string.cpp:23:7: error: reference to ‘string’ is ambiguous
string.h:5:8: error: candidates are: class MyString::string
/usr/include/c++/4.6/bits/stringfwd.h:65:33: error:                 typedef struct std::basic_string<char> std::string
string.cpp:23:7: error: reference to ‘string’ is ambiguous
string.h:5:8: error: candidates are: class MyString::string
/usr/include/c++/4.6/bits/stringfwd.h:65:33: error:                 typedef struct std::basic_string<char> std::string
string.cpp: In function ‘char* getString()’:
string.cpp:25:9: error: ‘ch’ was not declared in this scope
string.cpp: At global scope:
string.cpp:28:5: error: reference to ‘string’ is ambiguous
string.h:5:8: error: candidates are: class MyString::string
/usr/include/c++/4.6/bits/stringfwd.h:65:33: error:                 typedef struct std::basic_string<char> std::string
string.cpp:28:5: error: reference to ‘string’ is ambiguous
string.h:5:8: error: candidates are: class MyString::string
/usr/include/c++/4.6/bits/stringfwd.h:65:33: error:                 typedef struct std::basic_string<char> std::string
string.cpp: In function ‘int length()’:
string.cpp:30:9: error: ‘len’ was not declared in this scope
string.cpp: In function ‘int main()’:
string.cpp:35:2: error: reference to ‘string’ is ambiguous
string.h:5:8: error: candidates are: class MyString::string
/usr/include/c++/4.6/bits/stringfwd.h:65:33: error:                 typedef struct std::basic_string<char> std::string
string.cpp:35:9: error: expected ‘;’ before ‘obj’
make: *** [string] Error 1

我没有得到答案,为什么编译器显式使用MyNamespace中的字符串(即使用MyNamespace::string;)时会出现错误
这方面的任何建议都将非常有帮助。

您是cpp文件中的using namespace std。现在stdMySpace中分别有一个字符串,所以编译器不知道该选择哪一个。使用限定名称来区分它们,比如MyString::string而不是string,或者去掉using namespace std;,或者将整个实现放入namespace MyString { ... }中。

您将包含具有string标识符的<string.h>,并且您将使用using声明将MyClass引入全局命名空间。这会导致名称冲突。

只需删除<string.h>文件(您似乎根本没有使用它)。

命名空间是解决这个问题的方法。但是,ai建议始终保持所有签名的显式。

   using namespace std;

这是一个很好的快捷方式,如果你必须混合不同的库,如字符串、向量等,即STL+BOOST ,它会变得一团糟

删除using子句,并在每个STL对象上添加std::。