1

0StackExchange コミュニティの皆様

問題の原因を突き止めようと 2 時間試みましたが、完全に失敗しました。Research=google 検索も実行可能な解決策を提供しませんでした。少なくとも、VS 6.0 では、テンプレート関数の宣言と実装をヘッダーと .cpp ファイルの間で分割できないことがわかりました。

おそらく、私のアプローチには本質的に欠陥があるか、今回特に不快なのはVS 6.0です。

これが私が書いたテストコードです。

#include "stdafx.h"
#include <string>
#include <iostream>

class TestClass{

  public:
     template<class T> inline bool isNull(T& inObject){
        return 0;   // edited because of the answer by Joachim Pileborg  :)
                // initial code was: return (inObject != NULL) ? 0:1; 
  }

};

using namespace std;

int main(int argc, char* argv[])
{
    cout<<TestClass::isNull<string>("test");
    return 0;
}

このコードを実行すると、次のエラーが発生します。

致命的なエラー C1001: INTERNER COMPILER-FEHLER (コンパイラ ファイル "msc1.cpp"、行 1794)

ここで私が間違っていることを誰かが知っていますか?

PS:今回は、具体的な例を提供しながら、できるだけ正確に質問するように努めました。他に追加すべきことがあれば教えてください。

P.SS: Visual Studio 6.0 がかなり古いことは知っていますが、仕事で使用せざるを得ません。(自宅で)新しいコンパイラで同じコードを実行しても、エラーは発生しませんでした。これが、問題の主な原因が VS 6.0 の気まぐれであると推測する理由です。

助けてくれてありがとう!! JD

4

3 に答える 3

4

ポインターを返すカスタム キャスト演算子を定義しない限り、オブジェクト インスタンスが と等しくなることはありませんNULL

于 2013-01-21T09:45:53.830 に答える
1

コメントと回答に記載されている事実とは別に、コンパイラにバグがあり、有効なコードをコンパイルできない場合、内部コンパイラ エラーが発生します。

Microsoft は通常、これらのバグを IDE ホットフィックスまたは新しいバージョンのコンパイラで修正します。コードの構造を変更して、同じことを行うが外観が異なるようにしてください。これが、内部エラーの問題を回避する唯一の方法です。

于 2013-01-21T09:48:15.183 に答える
0

コードにはいくつかの問題があります。

私はそれをこのように書き直しました:

  • 渡した参照のアドレスを比較します(質問を編集inObject==NULLしましたが、関数の本文に書き込んだため、コンパイルもできませんでした)
  • const string&を使用しているので、呼び出すことができる必要がありますTestClass::isNull<string>("test");
  • 関数を自分のやり方で呼び出したい場合は、関数を静的として定義する必要があります
  • よくわかりませんが、Wordテンプレートに続く文字「<」はIDEで正しくエンコードされていないように見えたので、一般的なものに置き換えました<
  • これはコーディングの方法ですが、テンプレートを定義するときはクラスよりもタイプ名を使用することをお勧めします
  • trueandfalseの代わりに1andを使用する0ことをお勧めします(質問を編集しましたが、それでも0を返します...)

=>

#include <string>
#include <iostream>

class TestClass{

  public:
    template<typename T> 
    static bool isNull(const T& inObject)
     {
        return (&inObject == NULL) ? true : false;
    }

};

using namespace std;

int main(int argc, char* argv[])
{
    cout<< TestClass::isNull<string>("test");
    return 0;
}

これで、正常にコンパイルされます。

于 2013-01-21T09:51:30.113 に答える