类型相关的模板名称

时间:2017-10-02 17:19:07

标签: c++ templates

#include <iostream>

template<typename T>
void f(T x)
{
   g(x); // g is a dependent name
};

void g(int a)
{
   std::cout << a;
}

int main()
{
   int a = 12;
   f(a);
}

//this should be point of declaration for f<int>    

上面的代码给出了编译错误&#34;'g'未在此范围内声明,并且在实例化时没有通过参数依赖查找找到声明&#34;。

由于g是从属名称,因此在实例化时它的名称应该是可见的。请告诉我缺少什么?

2 个答案:

答案 0 :(得分:4)

实例化上下文中的查找仅考虑通过参数依赖查找找到的候选项。由于int没有关联的命名空间或类,因此该查找没有找到任何内容。

答案 1 :(得分:0)

版本4.7及更高版本的GNU C ++编译器不再执行它过去执行的一些额外的非限定查找,即依赖基类范围查找和非限定模板函数查找。 (Read more)

这可以通过使用-fpermissive来暂时解决。