0

クラス templateと、から継承するA非テンプレート クラスがあるとします。コンパイルは問題ありませんが、コンパイルによってリンカエラーが発生します。具体的には、BAAB

A.hpp

#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED

template <typename T>
class A { 
public:
    A();
    A(A<T>&& );
    virtual ~A();

    /* ... */
protected:
    T x;
};
#include A.tpp
#endif

A.tpp

#include "A.hpp"

template <typename T>
A<T>::A() { ... }

template <typename T>
A<T>::A(A<T>&& other)
   : x(std::move(other.x)) { }

template <typename T>
A<T>::~A() { ... }

testA.cpp

#include "A.hpp"

int main() {

    A<std::string> a;

    /* ... */

    return 0;
}

次のようにコンパイルtestA.cppすると成功します。

$ g++ -std=c++11 testA.cpp <-OK

class B次はから継承する非テンプレートAです:

B.hpp

#ifndef B_HPP_INCLUDED
#define B_HPP_INCLUDED
#include "A.hpp"
class B
    : public A<std::string> {
public:
    B();
    virtual ~B();

    static A<std::string> foo();
};
#endif

B.cpp

#include "B.hpp"

B::B()
    : A(std::move(foo())) { }

B::~B() { }

A<std::string> B::foo() { ... }

testB.cpp

#include "B.hpp"

int main() {
    B b;

    /* ... */

    return 0;
}

のコンパイルはtestB.cppうまくいっているようですが、リンカーは幸せなキャンパーではありません。

試行 1

$ g++ -std=c++11 testB.cpp   
Undefined references to B(), and ~B()
collect2: error: ld returned 1 exit status

試行 2

$ g++ -std=c++11 testB.cpp B.cpp
Undefined reference to B.foo()
collect2: error: ld returned 1 exit status

どんな助け/アイデアも大歓迎です。氏ldはほとんど夜通し私を起こして、私の正気を脅かしています。

編集

ありがとうマイク・シーモア!この最小限の例は、実際のコードを正確に表現したものではありませんでした。実際、実装には修飾子がなく、ギアのレンチでした。

4

3 に答える 3

3

2 つの異なるパスでコンパイルおよびリンクすることをお勧めします。

g++ -c -std=c++11 -o B.o B.cpp
g++ -c -std=c++11 -o TestB.o TestB.cpp
g++ -o test.exe B.o TestB.o

私が提案したことが壊れた場合、少なくともどこに何が欠けているかが明確になり、個々のオブジェクトファイルをnm.

于 2013-11-05T13:05:57.897 に答える
1
  $ g++ -std=c++11 testB.cpp   
  Undefined references to B(), and ~B()

これは明らかに間違っています(なぜあなたがこの試みをしているのかわからないので、私はただそう言います). コンパイルされていない別の (B.cpp) で定義されたシンボルを使用する 1 つの翻訳単位のみをコンパイルします。

問題を見つけるのに役立つように...testB.cppの背後にある実際のコンテンツを公開する必要があると思います。それはあなたの使用法にある可能性がありますfoo()

予想により:fooはクラスの静的メンバー メソッドであるため、テストでの呼び出しは次のようになります。

B::foo();
于 2013-11-05T13:14:45.733 に答える