【问题标题】:Using template functions in Visual Studio C++ 6.0在 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 已经很老了,但我不得不在工作中使用它”——辞掉工作。恐怕这是我能给你的最具建设性的建议。如果您的公司不关心为您提供足够的工具,那么他们就是一个糟糕的雇主。

标签: c++ visual-studio templates


【解决方案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!
猜你喜欢
  • 2018-10-07
  • 2011-03-02
  • 2017-05-05
  • 2015-07-07
  • 1970-01-01
  • 2016-07-13
  • 2020-02-05
  • 2015-04-22
  • 2014-07-26
相关资源
最近更新 更多