Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个单独的定义会导致错误?_C++_Header_Declaration_Extern - Fatal编程技术网

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的目标。我怀疑我最初用“地址”之类的东西做的例子是站不住脚的:)朋友的例子要好得多。我同意你的看法,这种定义方式更好:)