【发布时间】: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 已经很老了,但我不得不在工作中使用它”——辞掉工作。恐怕这是我能给你的最具建设性的建议。如果您的公司不关心为您提供足够的工具,那么他们就是一个糟糕的雇主。
标签: c++ visual-studio templates