小编Sha*_*ugh的帖子

在C++模板函数中,为什么依赖函数调用给出"未声明"错误?

在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++

5
推荐指数
2
解决办法
1481
查看次数

标签 统计

c++ ×1