在我的编程类中,我们刚刚介绍了C ++中的模板概念。这是我上个学期在Java课程中从未涉及的概念,C ++的整个语法实际上是让我循环。我将在下面发布的代码中收到一长串编译错误。这会让我觉得我在模板语法中遗漏了一些非常明显的东西。以下只是我正在尝试使用的一个示例模板,让我开始做作业。如果你们有任何关于为什么不编译的见解,我将不胜感激。谢谢!
keyValuePair.h
#include <fstream>
#include <iostream>
#include <string>
#ifndef KEYVALUEPAIR
#define KEYVALUEPAIR
template<class key, class value>
class keyValuePair
{
private:
key kvar;
value vvar;
public:
keyValuePair(); //Default Constructor
void setKvar(key object1); //Method to set kvar to a value
void setVvar(value object2); //Method to set vvar to a value
key getKvar(); //Method to return kvar
value getVvar(); //Method to return vvar
};
#include "keyValuePair.cpp"
#endif
keyValuePair.cpp
#include <iostream>
#include <fstream>
#include <string>
#include "keyValuePair.h"
template<class key, class value>;
keyValuePair<key, value>::keyValuePair()
{
}
template<class key, class value>; //return the value of kvar
key keyValuePair<key, value>::getKvar()
{
return kvar;
}
template<class key, class value>; //return the value of vvar
value keyValuePair<key, value>::getVvar()
{
return vvar;
}
template<class key, class value>; //set the value of kvar
void keyValuePair<key, value>::setKvar(key& object1)
{
object1 = kvar;
}
template<class key, class value>; //set the value of vvar
void keyValuePair<key, value>::setVvar(value& object2)
{
object2 = vvar;
}
的main.cpp
#include <fstream>
#include <iostream>
#include <string>
#include "keyValuePair.h"
using namespace std;
int main(int argc, char* argv[])
{
fstream myFile(argv[1], ios::in);
fstream fout("out.txt", ios::out);
myFile.close();
fout.close();
keyValuePair<string, int> sample;
sample.setKvar("Hello World.");
sample.setVvar(3);
cout << sample.getKvar() << sample.getVvar() << "\n";
return 0;
}
答案 0 :(得分:0)
在template<class key, class value>
之后删除分号:
!--here
template<class key, class value>;
keyValuePair<key, value>::keyValuePair()
{
}
答案 1 :(得分:0)
keyValuePair.h不应包含keyValuePair.cpp。 keyValuePair.cpp中的函数体也应该直接声明(模板与普通函数不同的最佳实践)
template<class key, class value>
class keyValuePair
{
private:
key kvar;
value vvar;
public:
keyValuePair(){} //Default Constructor
void setKvar(key object1){kvar = object1;} //Method to set kvar to a value
void setVvar(value object2){vvar = object2;} //Method to set vvar to a value
key getKvar(){return kvar;} //Method to return kvar
value getVvar(){return vvar;} //Method to return vvar
};
之后的分号
template<class key, class value>;
也是一个错字。
此外,您的setKvar函数将kvar的值分配给引用所采用的参数。我不这就是你想要看到的,因为函数是命名集。
模板类成员函数的主体通常在行中声明的原因是编译器只会生成特定类型的代码(如果它看到它们被用于特定类型,则称为实例化特定类型的模板)编译单元(通常是编译单元和.cpp文件是一样的)。
这意味着如果你将函数体放在keyValuePair.cpp中并尝试在main.cpp中使用它们,链接器会给你“找不到”错误,因为在编译单元keyValuePair.cpp中,编译器看不到它们是使用它所以它永远不会创建它们。
您可以直接为特定类型实例化模板:
template keyValuePair<int,long>;
然而,这可能是糟糕的风格,因为每次你想要将模板用于新类型时,你需要将这些声明添加到你的keyValuePair.cpp文件中,这样就失去了首先具有灵活性的目的。
答案 2 :(得分:0)
语法中有几个小错误。
您声明setKvar
和setVvar
按值获取参数,但定义它们以作为参考。 (将&
放入.cpp文件中)
请勿在{{1}}
在template<class key, class value>
和setKvar
中,您在作业中交换了论据。它应该与setVvar
中的kvar = object1;
类似,setKvar
vvar = object2;
不要在标题中包含cpp文件,将内容直接包含在头文件中,如PorkyBrain所说。