首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VS2008(+?)模板化函数和‘使用命名空间’的编译器错误

VS2008(+?)模板化函数和‘使用命名空间’的编译器错误
EN

Stack Overflow用户
提问于 2010-09-14 19:59:06
回答 2查看 211关注 0票数 5

我发现了一些代码(如下所示)在Visual Studio2008下不能编译的奇怪情况,并在第12行产生了一个"error C2872:'Ambiguity‘:ambiguous“。

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

同样的代码在GCC的指导下编译。

这两个编译器似乎都在using namespace Namespace定义之后为TemplatedFunction生成代码,至少我通过引入错误和查看它们的输出顺序可以看出这一点。

代码语言:javascript
复制
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位于由第三方代码生成的自动生成的文件中。

这是编译器中的错误吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-14 21:06:17

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-09-14 21:33:43

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

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

现在,编辑代码以将模板函数替换为NonTemplatedFunction(int a)并进行编译,生成一个程序集清单。查看程序集清单,您将看到为NonTemplatedFunction(int a)生成的程序集代码显示在_main PROC上方。

这些胡言乱语是什么意思?当Visual Studio2008编译器将您的模板转换为实际代码时,它实际上是在您的using声明之后将一些代码附加到文件的末尾。您的using声明意味着自动生成的代码中的名称是“不明确的”。gcc用来实例化模板的过程显然避免了这个问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3708626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档