在Visual Studio c++ 6.0中使用模板函数

Using template functions in Visual Studio C++ 6.0

本文关键字:函数 Visual Studio c++      更新时间:2023-10-16

亲爱的StackExchange社区,

我花了两个小时试图找到问题的根源,但完全失败了。研究=谷歌搜索也没有提供任何可行的解决方案。至少我能够发现,在VS 6.0下,不能将模板函数的声明和实现拆分为头文件和。pcp -file。

也许我的方法本身就有缺陷,或者是vs6.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: inner COMPILER- FEHLER(编译器文件"msc1.cpp",行1794)

有人知道我在这里做错了什么吗?

注:这次我真的很努力地尽可能准确地提出这个问题,并提供一个具体的例子。如果还有什么需要补充的,请告诉我。

p。SS:我知道visual studio 6.0很老了,但我不得不在工作中使用它。使用新的编译器(在家里)运行相同的代码不会导致任何错误。这就是为什么我认为这个问题主要是由VS 6.0的突发奇想引起的。

提前感谢您的帮助!!JD

除非你定义一个返回指针的自定义强制转换操作符,否则对象实例永远不可能等于NULL

除了在注释和回答中指出的事实外,内部编译器错误发生在编译器中存在错误,导致其无法编译有效代码的情况下。

微软通常在IDE热修复程序或新版本的编译器中修复这些错误。尝试修改代码的结构,使其做同样的事情,但看起来不同-这是避免内部错误问题的唯一方法。

您的代码中有几个问题:

我这样重写:

  • 比较你传递的引用的地址(你已经编辑了你的问题,但是你在函数体中写了inObject==NULL,它也无法编译)
  • using const string&所以必须能够调用TestClass::isNull<string>("test");
  • 你必须定义你的函数为静态如果你想调用它的方式
  • 我不确定,但是你的单词模板后面的字符'<'在我的IDE中看起来很糟糕,所以我用一个普通的<代替了它,它编译得更好
  • 这是一种编码方式,但在定义模板时更喜欢使用typename而不是class
  • 更喜欢使用truefalse而不是10(您编辑了您的问题,但您仍然返回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;
}

现在可以正常编译了