C++ 为什么这个单独的定义会导致错误?
挑战: 我有一段无法编译的代码。你能找出什么毛病吗?它曾经使我头痛C++ 为什么这个单独的定义会导致错误?,c++,header,declaration,extern,C++,Header,Declaration,Extern,挑战: 我有一段无法编译的代码。你能找出什么毛病吗?它曾经使我头痛 // header namespace values { extern std::string address; extern int port; } // .cpp file std::string ::values::address = "192.0.0.1"; int ::values::port = 12; 乍一看是对的。错误有多少,哪些是错误 一个错误: std::string v
// header
namespace values {
extern std::string address;
extern int port;
}
// .cpp file
std::string ::values::address = "192.0.0.1";
int ::values::port = 12;
乍一看是对的。错误有多少,哪些是错误 一个错误:
std::string values::address = "192.0.0.1";
是正确的形式,否则解析无效
std::string::values::address = "192.0.0.1";
在“字符串”中没有成员“地址”的成员“值”
它适用于内置类型,因为它们不能包含成员。。所以int::values是一个明确的解析,int::values,因为前面的语法没有意义
std::string (::values::address) = "192.0.0.1";
也行。请注意,如果键入def int sometype;使用sometype时会遇到与使用上面的字符串时相同的问题,但不能使用“int”。我游戏迟到了,但我更愿意将.cpp文件编写为:
// .cpp file
namespace values {
std::string address = "192.0.0.1";
int port = 12;
}
当然,这并不能解决您在
friend
声明中遇到的问题。这个问题与这个问题非常相似()。格式化也有同样的问题。是否应将其标记为重复关闭?:)@基里尔:不,他们不一样。特别要注意的是,在本例中,编译器处理这两行代码的方式有所不同。问题的关键是,如果这个问题是由一个有5个rep的人提出的,而这个人的名字谁也认不出来,那么这个问题在几秒钟内就会被人恨得一笔勾销。@John,我很困惑。它与其他问题有何不同?唯一的区别是我已经知道答案了。鼓励提出这些问题。我是有偏见的,但这个问题和你所联系的问题之间肯定有着天壤之别。@John:我认为这是一个天壤之别。这个问题启发了我,我学到了一些东西(C++的一个神秘点),而你链接到的问题是毫无用处的。此外,这里我们有一些元素来回答这个问题(代码片段)。我支持这种挑战,因为他们将知识带入了竞争,除非我错了,否则传播知识才是SO的目标。我怀疑我最初用“地址”之类的东西做的例子是站不住脚的:)朋友的例子要好得多。我同意你的看法,这种定义方式更好:)