C++ 如何从另一个类调用静态模板成员函数
首先,提前感谢您抽出时间。我对模板有点问题(我对模板这件事很陌生) <代码> C++中编译(或至少尝试)VisualStudio 2012。 main.h:C++ 如何从另一个类调用静态模板成员函数,c++,templates,member-functions,C++,Templates,Member Functions,首先,提前感谢您抽出时间。我对模板有点问题(我对模板这件事很陌生) C++中编译(或至少尝试)VisualStudio 2012。 main.h: class Main { public: template<class T> static void foo(T param1); }; 其他.cpp #include "main.h" template<class T> static void Main::foo(T param1) { // do things
class Main
{
public:
template<class T>
static void foo(T param1);
};
其他.cpp
#include "main.h"
template<class T>
static void Main::foo(T param1)
{
// do things
}
#include "other.h"
void Other::foo2()
{
int var1 = 10;
Main::foo(var1); // Here is the link error.
}
问题是,你可能知道很常见的未解决的外部符号,所以我环顾了一下网络,以找到一些可以帮助我理解和解决这个链接错误的东西,我发现了一些我已经尝试过但没有结果的东西
我试过:
1-在.h文件中实现foo函数
2-使用内联关键字
3-尝试导出(编译器实际上不支持导出)
但是这些方法似乎都不适合我,所以很明显我做错了什么,或者我错过了什么
请记住,模板化函数必须在“Main”类中声明。将函数移到“Other”类对我没有帮助,尽管这样可以解决错误
错误:
错误5错误LNK2019:未解析的外部符号“公共:静态无效”
__快速调用CGame::Push(char*,int,unsigned int&)“($Push@H@CGame@@SIXPADHAAI@Z)在函数“public:void”中引用
__thiscall ClientManager::RequestLogin(int,char*)“(?)?RequestLogin@ClientManager@@QAEXHPAD@Z)
其中,CGame将是Main、Push=foo()、ClientManager=Other和RequestLogin=foo2
再次感谢您的时间。#1是您应该使用的。其他人不行。为什么不起作用,我不知道。为什么不发布它的外观,以及使用#1时得到的结果?模板需要调用方可以使用它们的定义(而不仅仅是声明),以允许编译器正确生成模板扩展。Fernandes先生在之前的评论中链接的文章将进一步详细解释,但除非整个模板及其用法都在一个.cpp文件中声明和定义,否则您需要在类中或作为
内联
将正文放在.h文件中。可能问题是我“忘记了”(或没有考虑到)在头文件的定义中添加关键字inline。现在,它的工作非常有魅力。我想我是被“烧死”了,才能正确思考。谢谢你们两位!无论如何,您应该从函数定义中删除“static
”(在类之外,它表示“内部链接”,即“本地到当前翻译单元”)。比较:(错误:无法声明成员函数'static void Main::foo(T)'具有静态链接
)与(当然,您也可以直接在类内定义它:)@DanielLauro为类内声明和类外定义指定静态
无效(这会导致编译错误);两个“static”表示两个不同的东西(是的,这很混乱)[see]。因此,我们必须为类内声明指定static
,但不能为类外定义重复它[see]。或者,我们可以将定义“合并”到类内声明中[see]。链接的代码示例不会实例化新的Main。
#include "other.h"
void Other::foo2()
{
int var1 = 10;
Main::foo(var1); // Here is the link error.
}