Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从另一个类调用静态模板成员函数_C++_Templates_Member Functions - Fatal编程技术网

C++ 如何从另一个类调用静态模板成员函数

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

首先,提前感谢您抽出时间。我对模板有点问题(我对模板这件事很陌生)

<代码> 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
}
#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将是MainPush=foo()ClientManager=OtherRequestLogin=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.
}