Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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++_Templates_Standards Compliance - Fatal编程技术网

C++ 未命名命名空间中符号的模板访问

C++ 未命名命名空间中符号的模板访问,c++,templates,standards-compliance,C++,Templates,Standards Compliance,我们正在将xlc/C++编译器从V8.0升级到V10.1,发现一些代码现在给了我们一个错误,尽管它是在V8.0下编译的。下面是一个简单的例子: 测试h: #include <iostream> #include <string> template <class T> void f() { std::cout << TEST << std::endl; } #包括 #包括 模板 void f() { std::cout此测试失败,

我们正在将xlc/C++编译器从V8.0升级到V10.1,发现一些代码现在给了我们一个错误,尽管它是在V8.0下编译的。下面是一个简单的例子:

测试h:

#include <iostream>
#include <string>

template <class T>
void f()
{
  std::cout << TEST << std::endl;
}
#包括
#包括
模板
void f()
{

std::cout此测试失败,而在过去,它是最符合标准的编译器之一。因此,我倾向于认为代码编写时是错误的,尽管我无法在标准中指出原因。请注意,在轻松模式下编译代码成功。

此测试失败了wh过去,ICH已经成为了最符合标准的编译器之一。我倾向于认为代码是不正确的,但是我不能把你指在标准中的一行。为什么在轻松模式下编译代码是成功的。但是,

这不是有效的C++代码。<代码>测试< /C>不依赖。ent在模板参数
T
上,因此解析时必须在模板定义的上下文中找到它。但是,在该上下文中不存在
TEST
的声明,因此存在错误

该格式错误的模板的诊断消息可能会延迟到编译器实例化时,但如果编译器良好,它会更早诊断错误。即使在实例化模板时,也不会为该代码提供任何诊断消息的编译器不符合要求。这与未命名的命名空间无关


此外,注意,即使将未命名的命名空间置于该模板之上,也可以不是有效的C++程序,如果您在多个翻译单元中定义和调用该模板,这是因为同一模板参数的同一模板的不同实例将指向不同的事物。(未命名命名空间中的字符串每次在另一个转换单元中定义时都会生成不同的对象)这个程序不是有效的。

这不是有效的C++代码。<代码>测试< /COD>不依赖于模板参数<代码> t>代码>,所以在解析时必须在模板定义的上下文中找到。但是,在该上下文中,不存在“代码>测试< /COD>的声明,因此存在错误。

该格式错误的模板的诊断消息可能会延迟到编译器实例化时,但如果编译器良好,它会更早诊断错误。即使在实例化模板时,也不会为该代码提供任何诊断消息的编译器不符合要求。这与未命名的命名空间无关


此外,注意,即使将未命名的命名空间置于该模板之上,也可以不是有效的C++程序,如果您在多个翻译单元中定义和调用该模板,这是因为同一模板参数的同一模板的不同实例将指向不同的事物。(未命名命名空间中的字符串每次在另一个转换单元中定义时都会生成不同的对象)。这样一个程序的行为将是未定义的。

谢谢,Johannes。我希望你能插话。我发现旧的编译器通过了它,这很有趣。我是否可以阅读标准的某个方面来更好地理解这一点?@Fred编译器现在似乎已经改进了两阶段名称查找。请参阅模板常见问题解答:关于您的编辑,我也想到了。我认为我们解决这个问题的方法是从模板中删除这样的引用。不管怎样,这将是更正确的行为。谢谢你的链接。我回家后会查找它。我们工作时的互联网过滤器不会让我去那里。>8v(我想我在C++03标准草案的14.6.9中发现了这一点)(n2461.pdf)。谢谢,Johannes。我希望你能加入。我觉得很有趣,老编译器通过了。有没有标准可以让我更好地理解这一点?@Fred编译器现在似乎改进了两阶段名称查找。请参阅模板常见问题解答:关于你的编辑,我也想到了。我认为我们的解决方案这个问题的解决方法是从模板中删除此类引用。无论如何,这将是更正确的行为。感谢链接。我回家后会查找它。我们工作的互联网过滤器不会让我去那里。>8v(我想我在C++03标准草案(n2461.pdf)的14.6.9中找到了这个。
#include <string>
#include "test.h"

namespace
{
  std::string TEST = "test";
}

int main()
{
  f<int>();
  return 0;
}
"test.h", line 7.16: 1540-0274 (S) The name lookup for "TEST" did not find a declaration.
"test.cpp", line 6.15: 1540-1303 (I) "std::string TEST" is not visible.
"test.h", line 5.6: 1540-0700 (I) The previous message was produced while processing "f<int>()".
"test.cpp", line 11.3: 1540-0700 (I) The previous message was produced while processing "main()".