如何找到对重载的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”,但这没有帮助。有什么建议?
谢谢!
答案 0 :(得分:0)
通过实验,我发现“虚拟”声明部分解释了这个问题。尽管函数是内联的,并且我的代码从未显式或隐式地调用它,但似乎g ++希望它被定义。如果未声明为virtual,则编译器/链接器不需要定义。
我正走在这条路上(故意不定义一个功能)试图找出调用该函数的原因/位置。显然,g ++不会合作。我将不得不以某种不同的方式进行调试。
我仍然有两个与此帖子相关的g ++投诉:
1)似乎不应该定义永远不会被调用的内联函数,即使它被声明为虚拟。
2)需要能够让g ++告诉程序员它为什么引用它生成的目标文件中的给定入口点。明确的参考? C ++语言隐式调用?别的什么?在用户的代码中,调用了相应的规则?....