Linux gcc picking试图在函数所在的位置实例化一个模板
Linux gcc picking trying to instantiate a template where function should be
我有以下重现错误的示例代码:
// non-namespacing this compiles as expected
namespace n
{
template <typename T>
void foo(T const & t)
{
t.doesnt_have_this_method();
}
}
template <typename T>
void bar(T const & t)
{
// picks the template over the overload
n::foo(t);
}
namespace n
{
// function overload
void foo(int const &);
}
void n::foo(int const &) {}
int main()
{
int a;
bar(a);
}
该代码在MSVC 2010和Solaris 8编译器上都能很好地编译。但是gcc4(GCC)4.1.2 20071124(Red Hat 4.1.2-42)失败,错误为:
test.cpp: In function 'void n::foo(const T&) [with T = int]':
test.cpp:14: instantiated from 'void bar(const T&) [with T = int]'
test.cpp:34: instantiated from here
test.cpp:6: error: 'const int' has no member named 'doesnt_have_this_method'
模板bar
似乎没有看到foo
函数过载。我想弄清楚为什么会发生这种事。我知道有三件事可以缓解这个问题,但在生产环境中很难执行:
- 在CCD_ 4之前声明CCD_。这是我可以在我的prod代码中做的事情,但将来很难在整个代码库中强制执行
- 不将CCD_ 5放在命名空间中。这是我不能做的事情,因为我正在与另一个图书馆对接
- 使得过载成为模板专用化CCD_ 6。有些事情我不能做,因为
foo(int const &)
的声明超出了我的控制
请帮我了解如何解决这个问题。为什么编译器没有选择正确的函数?
在bar
的定义中,唯一可见的foo
是函数模板,因为另一个尚未声明。
相关文章:
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 如何正确实例化静态字段 tat 是另一个类对象
- C++ - 使用另一个类的构造函数实例化一个对象
- 如何使用另一个模板化类的实例模板化类?
- 如何使用其中一个具体类实例化抽象类?
- 另一个类中嵌套模板的外部实例化
- 即使我正在.cpp文件中实例化一个伪对象,.cpp文件内模板函数的定义也不起作用
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 在 C++17 中的每个实例化时生成一个新类型
- 如何使用 c++ 从另一个 cpp 文件中的 main.cpp 调用实例化类
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- 在模板中,有没有办法为每个时间实例化只编写一个专用化?(纳秒、毫秒、秒等)
- 在另一个对象 B 中创建对象 A 时,对象 A 是否是对象 B 的本地对象,对象 A 是否会存在于对象 B 的实例化之外?
- 实例化一个模板类,该类采用具有不同函数签名的构造函数中的函数指针
- 在类实例化时生成一个数字
- C++-为任何lambda创建一个实例化桶