1

0尊敬的 StackExchange 社区,

我花了两个小时试图找到问题的根源,但完全失败了。Research=google 搜索也没有提供任何可行的解决方案。至少我能够发现,在 VS 6.0 下,不能在 header 和 .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 的突发奇想引起的。

提前感谢您的帮助!京东

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");
  • 如果你想以你的方式调用它,你必须将你的函数定义为静态的
  • 我不确定,但是你的单词模板后面的字符 '<' 在我的 IDE 中看起来编码很糟糕,所以我用一个普通的替换它<,它编译得更好
  • 这是一种编码方式,但在定义模板时更喜欢使用 typename 而不是 class
  • 更喜欢使用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 回答