繁体   English   中英

带有模板化函数和'using namespace'的VS2008(+?)编译器错误

[英]VS2008(+?) compiler bug with templated functions and 'using namespace'

我发现这个奇怪的情况下某些代码(如下)不能在Visual Studio 2008下编译,并在第12行产生“错误C2872:'歧义':模糊符号”。

在最后一行删除使用namespace RequiredNamespace修复错误,但我希望在文件末尾using namespace应该没有效果。 它还依赖于AnotherFunction作为模板函数,所以我希望编译器在错误的范围内生成模板化函数,或者在执行此操作之前不重置正在使用的命名空间列表。

相同的代码在GCC下编译。

两个编译器似乎都在using namespace Namespace定义之后为TemplatedFunction生成代码,至少就我所知,引入错误并查看它们输出的顺序。

namespace Ambiguity
{
    class cSomeClass
    {
    };

    template<class T>
    void TemplatedFunction(T a)
    {
        // this is where the error occurs, the compiler thinks Ambiguity
        // might refer to the class in RequiredNamespace below
        Ambiguity::cSomeClass(); 
    }
}

namespace RequiredNamespace 
{
    // without a namespace around this class, the Ambiguity class 
    // and namespace collide
    class Ambiguity
    {
    };
}

int main()
{
    // to force the templated function to be generated
    Ambiguity::TemplatedFunction(4); 
}

// removing this removes the error, but it shouldn't really do anything
using namespace RequiredNamespace; 

显然这是一个制造的示例,但原始文件是从一个真实案例中提取的,其中using namespace位于由第三方代码生成的自动生成的文件中。

这是编译器中的错误吗?

我同意这是一个错误,但通过生成与您的文件对应的程序集列表(使用cl.exe的/ Fa选项)可以了解对正在发生的事情的一些了解。

因此,注释掉using声明,生成.asm文件并在文本编辑器中打开它。 扫描文件,您可以看到模板的实例化位于文件的底部(它以??$TemplatedFunction@H@Ambiguity@@YAXH@Z PROC ),它位于为主文件生成的程序集之下function(以_main PROC开头)。 错误消息表示“请参阅函数模板实例化”,因此它指的是模板函数的实例化,并且汇编列表清楚地表明此实例化位于文件的底部。

现在,编辑代码以使用NonTemplatedFunction(int a)替换模板函数并编译,生成程序集列表。 查看汇编列表,您将看到为NonTemplatedFunction(int a)生成的汇编代码出现在_main PROC上方。

所有这些唠叨是什么意思? 当Visual Studio 2008编译器将您的模板转换为实际代码时,它会在您使用声明后有效地将一些代码附加到文件的末尾。 您的使用声明意味着自动生成的代码中的名称是“不明确的”。 gcc用于实例化模板的过程显然避免了这个问题。

根据C ++ 03标准的7.3.4第1段,我认为这是一个错误:

using-directive指定指定命名空间中的名称可以在using-directive出现在using-directive之后的范围内使用。

因此,使用声明的文件结束应该没有效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM