在 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 << TestClass::isNull<string>(string("test"));
或 ... 来帮助编译器
2) 没有明确指定模板参数cout << TestClass::isNull(string("test"))
,或者...
而且,模板应该将其参数设为const T&
,因为您将临时对象传递给它。
“我知道 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<string>("test");
如果你想以你的方式调用它,你必须将你的函数定义为静态
我不确定,但是你的单词模板后面的字符“< 替换它,它编译得更好
这是一种编码方式,但在定义模板时更喜欢使用 typename 而不是 class
更喜欢使用true
和false
而不是1
和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;
现在可以正常编译了。
【讨论】:
谢谢 :) - 我尝试运行您的代码,但仍然遇到同样的错误。 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 Studio 2010 应用程序大小