在C++模板函数foo()中,对:: bar(TT*)的调用在gcc 4.4.3下给出以下错误:
g++ -o hello.o -c -g hello.cpp
hello.cpp: In function 'void foo(std::vector<TT*, std::allocator<TT*> >&)':
hello.cpp:8: error: '::bar' has not been declared
Run Code Online (Sandbox Code Playgroud)
这是有问题的代码:
// hello.cpp
#include <vector>
template<typename TT> void foo(std::vector<TT*> &vec)
{
TT *tt;
::bar(tt);
vec.push_back(tt);
}
class Blah
{
};
void bar(Blah *&)
{
}
int main(int argc, char *argv[])
{
std::vector<Blah*> vec;
foo(vec);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++区分依赖于模板参数(此处为TT)的符号和独立且可立即求值的符号.
很明显,编译器认为我的:: bar(TT*)调用是独立的,并尝试立即解决它.正如显然,该函数调用是依赖于TT,因为函数调用采用类型TT*的参数,所以编译器应该等到把foo(VEC)实例解析::巴(TT*).
这是一个gcc错误还是我遗漏了一些关于C++模板的微妙之处?
编辑:这是一个稍微复杂的例子,有两个版本的:: bar()来澄清声明顺序不是问题的问题.在解析模板时,编译器无法知道下面的main()是否将使用TT = Blah或TT = Argh来实例化模板函数.因此,编译器不应该在最早(如果有的话)第35行第28行之前给出错误.但是第8行第16 行给出了错误. …
c++ ×1