当编译器尝试解析i.template hi<T>();
时,它会在全局命名空间中找到hi
而不是hi
上的方法i
(ideone)。为什么呢?
#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
导入的类型)与我的一个成员函数具有相同的名称时,就会出现冲突。显然,我希望我的实现代码是健壮的,不会导致用户代码中的随机名称冲突。