c++模板使用与成员函数指针

Posted

技术标签:

【中文标题】c++模板使用与成员函数指针【英文标题】:c++ template usage with member function pointer 【发布时间】:2013-03-27 09:38:42 【问题描述】:

以下内容根本无法编译,我无法修复它。 希望好心人能让我明白如何修正这个例子。

谢谢

我尝试编译:

# make
g++    -c -o client.o client.cpp
client.cpp: In function `int main()':
client.cpp:7: error: missing template arguments before "t"
client.cpp:7: error: expected `;' before "t"
client.cpp:8: error: `t' undeclared (first use this function)
client.cpp:8: error: (Each undeclared identifier is reported only once for each function it appears in.)
<builtin>: recipe for target `client.o' failed
make: *** [client.o] Error 1

client.cpp - 主要

#include<stdio.h>
#include"Test.h"
#include"Other.h"

int main() 

        Test<Other> t = Test<Other>(&Other::printOther);
        t.execute();

        return 0;

测试.h

#ifndef TEST_H
#define TEST_H

#include"Other.h"

template<typename T> class Test 

        public:
                Test();
                Test(void(T::*memfunc)());
                void execute();

        private:
                void(T::*memfunc)(void*);
;

#endif

Test.cpp

#include<stdio.h>
#include"Test.h"
#include"Other.h"


Test::Test() 


Test::Test(void(T::*memfunc)()) 
        this->memfunc= memfunc;


void Test::execute() 
        Other other;
        (other.*memfunc)();

其他.h

#ifndef OTHER_H
#define OTHER_H

class Other 
        public:
                Other();
                void printOther();
;

#endif

其他.cpp

#include<stdio.h>
#include"Other.h"


Other::Other() 


void Other::printOther() 
        printf("Other!!\n");

生成文件

all: main

main: client.o Test.o Other.o
        g++ -o main $^

clean:
        rm *.o

run:
        ./main.exe

Makefile 将允许轻松编译。

【问题讨论】:

【参考方案1】:

不幸的是 it's not possible 将模板类的实现写入 cpp 文件(即使 there is a workaround 如果您确切知道要使用的类型)。模板类和函数应该在头文件中声明和实现。

您必须将Test 的实现移到其头文件中。

【讨论】:

不正确...请参阅 Benoît 在您的链接中的回答。 @JimBalter,我正要编辑我的答案以插入该选项。【参考方案2】:

简单修复: 将Test.cpp中的函数定义内联移到Test.h中的类中

模板类的成员函数的定义必须在同一个编译器单元中。通常在定义类的同一个 .h 中。如果您没有将函数定义内联到类中,并且只想要声明,则需要在每个函数的定义(以及定义的一部分)之前添加“神奇”字样template&lt;typename T&gt;。这只是一个大致的答案,为您提供修改参考文档的方向,以及一些示例。

【讨论】:

以上是关于c++模板使用与成员函数指针的主要内容,如果未能解决你的问题,请参考以下文章

基类的函数指针指向子类的成员函数?

C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针

c++类的成员函数指针如何转为普通指针

成员函数指针值上的 Consexpr - 未定义的行为?

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

C++ 指向成员函数指针问题