C++ 在Visual Studio C++;6
0亲爱的StackExchange社区: 我花了两个小时试图找出问题的根源,但完全失败了。研究=谷歌搜索也没有提供任何可行的解决方案。至少我能够发现,在VS6.0下,不能在头文件和.cpp文件之间分割模板函数的声明和实现 也许我的方法本身就有缺陷,或者是VS6.0这次特别令人讨厌 这是我编写的测试代码C++ 在Visual Studio C++;6,c++,visual-studio,templates,C++,Visual Studio,Templates,0亲爱的StackExchange社区: 我花了两个小时试图找出问题的根源,但完全失败了。研究=谷歌搜索也没有提供任何可行的解决方案。至少我能够发现,在VS6.0下,不能在头文件和.cpp文件之间分割模板函数的声明和实现 也许我的方法本身就有缺陷,或者是VS6.0这次特别令人讨厌 这是我编写的测试代码 #include "stdafx.h" #include <string> #include <iostream> class TestClass{ public:
#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;
}
#包括“stdafx.h”
#包括
#包括
类TestClass{
公众:
模板内联bool为空(T&inObject){
返回0;//由于Joachim Pileborg的答案而编辑:)
//初始代码为:return(inoobject!=NULL)?0:1;
}
};
使用名称空间std;
int main(int argc,char*argv[])
{
cout除非定义一个返回指针的自定义强制转换运算符,否则对象实例永远不能等于NULL
除非定义一个返回指针的自定义强制转换运算符,否则对象实例永远不能等于NULL
,除了注释和答案中指出的事实之外,内部编译器错误在这种情况下,当编译器中出现错误时,会阻止它编译有效代码
Microsoft通常在IDE热修复程序或较新版本的编译器中修复这些错误。尝试修改代码结构,使其执行相同的操作,但外观不同-这是避免内部错误问题的唯一方法。除了注释和答案中指出的事实外,在出现错误的情况下会发生内部编译器错误编译器中有一个bug,它阻止编译器编译有效代码
Microsoft通常会在IDE修补程序或较新版本的编译器中修复这些错误。请尝试修改代码结构,使其执行相同的操作,但外观不同-这是避免内部错误问题的唯一方法。您的代码中有几个问题:
我是这样改写的:
- 比较您正在传递的引用的地址(您已经编辑了问题,但是您在函数体中编写了
inoobject==NULL
,并且它也无法编译)
- 使用常量字符串&so必须能够调用
TestClass::isNull(“test”);
- 如果要以这种方式调用函数,必须将函数定义为静态函数
- 我不确定,但是这个角色
#包括
#包括
类TestClass{
公众:
样板
静态布尔值为空(常量T&inObject)
{
返回(&inObject==NULL)?true:false;
}
};
使用名称空间std;
int main(int argc,char*argv[])
{
cout您的代码中有几个问题:
我是这样改写的:
- 比较您正在传递的引用的地址(您已经编辑了问题,但是您在函数体中编写了
inoobject==NULL
,并且它也无法编译)
- 使用常量字符串&so必须能够调用
TestClass::isNull(“test”);
- 如果要以这种方式调用函数,必须将函数定义为静态函数
- 我不确定,但是这个角色
#包括
#包括
类TestClass{
公众:
样板
静态布尔值为空(常量T&inObject)
{
返回(&inObject==NULL)?true:false;
}
};
使用名称空间std;
int main(int argc,char*argv[])
{
为什么可以使用三元运算符?只需使用返回比较结果,因为它已经是布尔值。VC++6.0对模板的支持非常缺乏。您可以尝试1)通过显式构造参数来帮助编译器,而不是依赖转换cout 2)不显式指定模板参数cout,以及模板应该将其参数设置为常量T&
,因为您要将临时变量传递给模板。“我知道visual studio 6.0已经很旧了,但我不得不在工作中使用它”–辞职。恐怕这是我能给你的最具建设性的建议。如果你的公司不关心为你提供足够的工具,他们是个糟糕的雇主。为什么要使用三元运算符?只需使用返回比较结果,因为它已经是布尔值。VC++6.0对模板的支持非常缺乏。你可以试试1) 通过显式构造参数来帮助编译器,而不是依赖于转换cout 2)不显式指定模板参数cout,模板应将其参数作为const T&
,因为您正在向其传递临时变量。“我知道visual studio 6.0已经很旧了,但我不得不在工作中使用它”–辞职。恐怕这是我能给你的最有建设性的建议。如果你的公司不关心为你提供足够的工具,他们就是一个糟糕的雇主。okey id不知道,谢谢-但我一直更新我的代码,只返回0,它仍然抛出相同的错误:(AndreyLujankin)我想现在是时候考虑更新Visual Studio了。6版是很古老的,包含了很多不固定的bug。OKI我会尝试向IT部门恳求……我不认为他们会听。我是C++中唯一的人,所以他们不会很有动机去迎合我的需求。谢谢-我仍然更新了我的代码,一直只返回0,它仍然抛出相同的错误:(AndreyLujankin,我想现在是时候考虑更新Visual Studio了。6版是很古老的,包含了一些不固定的bug。OKI我会尝试向IT部门恳求……我不认为他们会听。我是C++中唯一的人,所以他们不会很有动力来满足我的需要。谢谢:-我试着运行你的代码,但我仍然有同样的错误。VS 3.0确实是个问题。你尝试过VS C++ 6吗?
#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;
}