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

Posted

技术标签:

【中文标题】在 Visual Studio C++ 6.0 中使用模板函数【英文标题】:Using template functions in Visual Studio C++ 6.0 【发布时间】:2013-01-21 09:42:43 【问题描述】:

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 行)

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

附: : 这一次我真的很努力地尽可能准确地提出这个问题,也提供了一个具体的例子。如果还有什么我应该添加的,请告诉我。

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

提前感谢您的帮助! 京东

【问题讨论】:

为什么要使用三元运算符?只需使用 return 比较的结果,因为它已经是一个布尔值。 VC++ 6.0 对模板的支持非常缺乏。您可以尝试 1) 通过显式构造参数而不是依赖转换 cout &lt;&lt; TestClass::isNull&lt;string&gt;(string("test")); 或 ... 来帮助编译器 2) 没有明确指定模板参数cout &lt;&lt; TestClass::isNull(string("test")),或者... 而且,模板应该将其参数设为const T&amp;,因为您将临时对象传递给它。 “我知道 Visual Studio 6.0 已经很老了,但我不得不在工作中使用它”——辞掉工作。恐怕这是我能给你的最具建设性的建议。如果您的公司不关心为您提供足够的工具,那么他们就是一个糟糕的雇主。 【参考方案1】:

除非您定义返回指针的自定义转换运算符,否则对象实例永远不能等于NULL

【讨论】:

okey id 不知道,谢谢-我仍然更新了我的代码以始终返回 0,但它仍然抛出相同的错误:( @AndreyLujankin 那么我认为是时候考虑更新 Visual Studio 了。第 6 版是古老的,包含很多无法修复的错误。 好吧,我会尝试向 IT 部门恳求……我认为他们不会听。我是唯一一个用 C++ 编写代码的人,所以他们不会很积极地满足我的需求【参考方案2】:

除了在 cmets 和 answers 中指出的事实之外,内部编译器错误发生在编译器存在错误时,会阻止它编译有效代码。

Microsoft 通常会在 IDE 修补程序或较新版本的编译器中修复这些错误。尝试修改代码结构,使其执行相同的操作,但外观不同 - 这是避免内部错误问题的唯一方法。

【讨论】:

任何想法在上述特定情况下我怎么能做到这一点? 您是否阅读了所有答案?您也可以始终返回 false,因为不可能将引用传递给 NULL 对象。如果你传递了一个指针,这将是有意义的——在这种情况下,就不需要模板,有效地解决了问题。 我确实尝试始终返回 0 - 我什至相应地更改了上面的代码。问题是我似乎根本无法使用任何模板。我尝试构建尽可能简单的示例。【参考方案3】:

您的代码中有几个问题

我是这样重写的:

比较您传递的参考地址(您已经编辑了您的问题,但您在函数体中写了inObject==NULL,它也无法编译) 使用 const string& 所以必须能够调用TestClass::isNull&lt;string&gt;("test"); 如果你想以你的方式调用它,你必须将你的函数定义为静态 我不确定,但是你的单词模板后面的字符“< 替换它,它编译得更好 这是一种编码方式,但在定义模板时更喜欢使用 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;

现在可以正常编译了。

【讨论】:

谢谢 :) - 我尝试运行您的代码,但仍然遇到同样的错误。 VS 6.0 一定是个问题 你用 VS C++ 6.0 试过了吗? @Angrew 你是对的,我确定它不起作用 :-) 我修改了代码 @Andrey 不,我很高兴我再也不会接触 VC 6.0。我现在在工作中使用 VC 10.0。并希望尽快将其留给 VC 11.0,以便更符合 C++11。 引用永远不能为 NULL!

以上是关于在 Visual Studio C++ 6.0 中使用模板函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 代码在 msdev 6.0 中运行良好,在 Visual Studio 2010 中崩溃

从 Visual Studio C++ 6.0 到 VS 2008?

visual c++ 6.0编译时总有一个错误是怎么回事?

Visual c++ 6.0 应用程序大小大于 Visual Studio 2010 应用程序大小

microsoft visual c++ 6.0英文版怎么安装?

visual C++ 6.0 是先点“Compile”还是“Build”?分不分点击顺序??作用各是啥??