1

次のコードを取得しました。

FooClass.h

#pragma once

#include <string>
#include "StdAfx.h"
#include "FooClass.h"

#include <iostream>
#include "FooClass.h"

FooClass::FooClass(void)
{
}


FooClass::~FooClass(void)
{
}


int PrintMsg (std::string msg)
{
    printf ("%s\n", msg);
    return 1;
}

class FooClass
{
public:
    FooClass(void);
    ~FooClass(void);

    static int PrintMsg (std::string msg);
};

FooClass.cpp


CODETESTER.cpp

// CODETESTER.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "FooClass.h"

int _tmain(int argc, _TCHAR* argv[])
{
    FooClass::PrintMsg ("Hi World!!");

    return 0;
}

プロジェクトをビルドすると、次のエラーが発生します。

Erro 4 error LNK2019: símbolo externo indefinido "public: static int __cdecl FooClass::PrintMsg(class std::basic_string,class std::allocator >)" (?PrintMsg@FooClass@@SAHV?$basic_string@DU?$char_traits@ D@std@@V?$allocator@D@2@@std@@@Z) _wmain E:\2 を参照してください。MEZASOFT\DESENVOLVIMENTO\PROTOTIPOS\CODETESTER\CODETESTER\CODETESTER.obj CODETESTER

このテーマとヘルプに関するいくつかの記事を読みましたが、修正方法がわかりませんでした。

リンカに PrintMsg コードの場所を知らせるには .h では不十分であることはわかっていますが、どうすれば解決できますか。

これが基本的な質問である場合は申し訳ありません。私はずっと前に、優れた C プログラマーでした。私は C++ プログラマーとして戻ってきます。

4

1 に答える 1

2

FooClass の PrintMsg 関数を宣言しましたが、定義/実装していません。代わりに、実際には FooClass に関連付けられていない関数 PrintMsg を定義しました。

FooClass の PrintMsg 関数を適切に実装するには:

int FooClass::printMsg(std::string msg)
{
    printf("%s\n", msg.c_str());
    return 1;
}

補足として、おそらくパラメーター msg を参照渡しする必要があります。この方法では、printMsg が呼び出されるたびに文字列オブジェクトがコピーされることはありません。

// you'll also need to change the printMsg declaration inside the FooClass
int FooClass::printMsg(const std::string &msg)
{
    printf("%s\n", msg.c_str());
    return 1;
}
于 2013-04-04T00:30:05.167 に答える