3

以下は単にコンパイルされず、修正できません。良い魂がこの例を修正する方法を理解してくれることを願っています.

ありがとう

私はコンパイルしようとします:

# 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;
}

Test.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");
}

Makefile

all: main

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

clean:
        rm *.o

run:
        ./main.exe

Makefile を使用すると、簡単にコンパイルできます。

4

2 に答える 2

4

残念ながら、テンプレート クラスの実装を cpp ファイルに書き込むことはできません(使用する型が正確にわかっている場合は回避策があります)。テンプレート クラスと関数は、ヘッダー ファイル内で宣言および実装する必要があります。

の実装をTestヘッダー ファイル内に移動する必要があります。

于 2013-03-27T09:50:52.760 に答える
1

簡単な修正: Test.cpp インラインの関数の定義を Test.h のクラスに移動します。

テンプレート クラスのメンバー関数の定義は、同じ compiler-unitにある必要があります。通常、クラスが定義されている同じ .h にあります。関数の定義をクラスにインライン化せず、宣言のみが必要な場合は、各関数の定義 (および定義の一部) の前に「魔法の」言葉を追加する必要がありますtemplate<typename T>。これは、参照ドキュメントといくつかの例を改訂する方向性を示すためのおおよその回答にすぎません。

于 2013-03-27T09:51:07.343 に答える