1

重複の可能性:
テンプレートを使用すると、「未解決の外部シンボル」エラーが発生するのはなぜですか?
テンプレートクラス関数への「未定義の参照」

次の行でエラーが発生しました:Console :: getInstance()-> readObjectData(a); main.cppで

未定義の参照void Console::readObjectData<std::string>std::string&)

Console.h http://pastebin.com/WsQR7JNq

#define CONSOLE_H
#include <string>

using namespace std;

class Console
{
public:
    static Console* getInstance();


    template <typename T>
    void readObjectData(T& o);
protected:
private:
    Console();  // Private so that it can  not be called
    Console(Console const&);             // copy constructor is private
    Console& operator=(Console const&);  // assignment operator is private
    static Console* m_pInstance;


};
    #endif // CONSOLE_H

Console.cpp http://pastebin.com/N02HjgBw

#include "Console.h"
#include "Log.h"
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

// Global static pointer used to ensure a single instance of the class.
Console* Console::m_pInstance = NULL;

Console::Console()
{

}

Console::Console(Console const&)
{

}

Console& Console::operator=(Console const&)
{

}

Console* Console::getInstance()
{
if (!m_pInstance)   // Only allow one instance of class to be generated.
    m_pInstance = new Console;

return m_pInstance;
}


template <typename T>
void Console::readObjectData(T& o) {
     //cin >> o;
}

main.cpp http://pastebin.com/U6qAJUN1

#include "Console.h"

using namespace std;

int main()
{

    string a;

    Console::getInstance()->readObjectData(a);
    return 0;
}

何か案は?

4

6 に答える 6

3

.cppファイルでtemplate<>'d関数を定義することはできません。

動く

template <typename T>
void Console::readObjectData(T& o) {
     //cin >> o;
}

ヘッダーファイルへ。

于 2012-10-08T17:37:39.480 に答える
2

このメソッドは実装していません。テンプレートの実装を.hファイルで提供する必要があります

于 2012-10-08T17:36:17.827 に答える
2

readObjectDataの実装をヘッダーに配置していないため、関数の明示的な特殊化(std :: string&を使用するもの)を提供する必要があります。

これはConsole.cppに入るはずです:

template <>
void Console::readObjectData(string& o) {
    //cin >> o;
}
于 2012-10-08T17:36:59.597 に答える
1

テンプレートメソッドの実装をConsole.cppヘッダーファイルに表示する必要があります。または、の明示的な特殊化を実装する必要がありますstd::string

于 2012-10-08T17:36:59.700 に答える
0

一部のC++ファイルを出力(エグゼクティブ、共有ライブラリ、または...)に変換するプロセスでは、2つのツールが連携します。最初にオブジェクトファイルを作成するコンパイラー、次にそれらのオブジェクトを出力に変換するリンカーです。リンカはテンプレートとは何の関係もありません(明示的なインスタンス化の特別な場合を除く)。テンプレートはコンパイラによってインスタンス化されます。もう1つの注意点は、コンパイラがそのソースファイルに含まれる各ソースファイルとヘッダーを処理し、無視することです。プロジェクトの他のすべてのファイル。したがって、コンパイラがコンパイルmain.cppしたい場合、readObjectDataしたがって、その関数のオブジェクトファイルにコードを生成することはできません。また、リンカーがオブジェクトをリンクして結果を取得する場合、その関数の実装は見つかりません。したがって、最も簡単な方法は、の実装をファイルに移動することでreadObjectDataあり.h、すべてが期待どおりに機能します。

于 2012-10-08T17:46:23.893 に答える
0

テンプレート化された関数(readObjectData)の定義は、.cppファイルではなく、インライン化する必要があります。コンパイラは、テンプレート化された関数を持つクラス、またはテンプレート化されたクラスを検出すると、新しい型が残ったクラス全体のコピーを作成します。したがって、関数の定義を.cppファイルに固定すると、実装が存在しないため、コンパイラは実装がどこにあるかを認識できません。

于 2012-10-08T17:38:05.733 に答える