为什么这个单独的定义会导致错误?

时间:2010-03-01 19:38:01

标签: 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;

第一眼看上去是正确的。有多少,哪些是错误!?

2 个答案:

答案 0 :(得分:8)

一个错误:

std::string values::address = "192.0.0.1"; 

是正确的形式,否则解析是

std::string::values::address = "192.0.0.1"; 

并且“string”中没有成员“地址”的成员“值”...

它适用于内置类型,因为它们不能包含成员..所以int :: values是一个明确的解析,int :: values,因为先验没有意义。

std::string (::values::address) = "192.0.0.1"; 

也有效。注意,如果你键入def int sometype;使用sometype时遇到的问题和上面的字符串一样,但不是“int”。

答案 1 :(得分:3)

我已经迟到了,但我宁愿把.cpp文件写成:

// .cpp file
namespace values {
  std::string  address = "192.0.0.1";
  int          port    = 12;
}

当然,这并不能解决您使用friend声明所遇到的问题。