为什么这个依赖名称查找会找到全局标识符而不是方法?

时间:2015-01-13 19:56:01

标签: c++ templates c++11 gcc name-lookup

当编译器尝试解析i.template hi<T>();时,它会在全局命名空间中找到hi而不是hi上的方法iideone)。为什么呢?

#include <cstdio>

// Define 'hi' and 'bye' in the global namespace; these should *not* be used
template<typename T> struct hi { };
template<typename T> struct bye { };

// Foo needs to be templated for Foo::Inner to be a dependent type (I think)
template<typename T>
struct Foo
{
    struct Inner {
        // This is a plain-old templated member function of Inner, yes?
        template<typename U>
        void hi() { std::printf("hi!\n"); }

        // This is a plain-old member function of Inner
        void bye() { std::printf("bye!\n"); }
    };

    void sayStuff()
    {
        Inner i;
        i.template hi<T>();   // Fails to compile -- finds global hi instead of member
        i.bye();              // Compiles fine, finds member
    }
};

int main() {
    Foo<int> f;
    f.sayStuff();
    return 0;
}

我正在使用g ++ 4.9.1 / 4.9.2(-std=c++11)。确切的错误消息:

prog.cpp: In member function 'void Foo<T>::sayStuff()':
prog.cpp:19:5: error: invalid use of 'struct hi<T>'
   i.template hi<T>();
     ^

此代码适用于Clang和VS2013,但在g ++和EDG中生成错误。但哪些编译器是对的?

除了更改会员名称外,还有什么方法可以解决这个问题吗?在我的实际代码中,当std命名空间中的类型(通过using namespace std导入的类型)与我的一个成员函数具有相同的名称时,就会出现冲突。显然,我希望我的实现代码是健壮的,不会导致用户代码中的随机名称冲突。

0 个答案:

没有答案