找不到重载operator()的神秘调用

时间:2016-04-20 16:08:21

标签: function call overloading operator-keyword

如何找到对重载的operator()函数的(显然是编译器生成的隐式)调用?

g ++的输出只是

/tmp/<garbagename.o>:(.rodata._ZTVN3MAT3A1DIiEE[_ZTVN3MAT3A1DIiEE]+0x50): 
undefined reference to `A1D<int>::operator()(A1D<int>)'

没有“在函数中”或任何其他指示函数被调用的位置。只有一行输出 - 除了错误之外没有更多:ld返回1退出状态。

导致未定义引用的代码我已经简化为无效的骨架:

A1D<int> find(A1D<bool> data) {
   A1D<int> nothing;
   return nothing;
}

A1D有一个复制构造函数,但它不会调用operator()。 底线:

1)声明该函数(在A1D的模板类声明中): 虚拟内联A1D运算符()(A1D A);

2)我故意没有定义A1D :: operator()(A1D),因为我怀疑我的实现是在我没想到的时候调用的。所以...我理解为什么它是未定义的。我不明白为什么它被引用,因为我没有看到任何引用。

3)同样,我不希望调用该函数,因为它似乎没有在我的代码中的任何地方引用。

3)我将主程序简化为一个空的main(){},只包含一个包含A1D定义的模板头文件和一个包含find()定义的第二个头文件。

4)如果我删除了find函数的定义,那么错误消失了,可执行文件(什么都不做)链接没有错误。

5)我知道作为返回链接的一部分,为find()函数调用了A1D的复制构造函数,但是我没有看到它与     运算符()(A1D) 功能

我想让g ++编译器告诉它为什么要生成对operator()(A1D)的调用。我试过“-v”,但这没有帮助。有什么建议?

谢谢!

1 个答案:

答案 0 :(得分:0)

通过实验,我发现“虚拟”声明部分解释了这个问题。尽管函数是内联的,并且我的代码从未显式或隐式地调用它,但似乎g ++希望它被定义。如果未声明为virtual,则编译器/链接器不需要定义。

我正走在这条路上(故意不定义一个功能)试图找出调用该函数的原因/位置。显然,g ++不会合作。我将不得不以某种不同的方式进行调试。

我仍然有两个与此帖子相关的g ++投诉:

1)似乎不应该定义永远不会被调用的内联函数,即使它被声明为虚拟。

2)需要能够让g ++告诉程序员它为什么引用它生成的目标文件中的给定入口点。明确的参考? C ++语言隐式调用?别的什么?在用户的代码中,调用了相应的规则?....