0

在我的编程课上,我们只是被介绍到 C++ 中模板的概念。这是我们在上学期的 Java 课程中从未涉及过的概念,而 C++ 的整个语法真的让我陷入了一个循环。我将在下面发布的代码收到一长串编译错误。这会让我觉得我在模板语法中遗漏了一些非常明显的东西。以下只是我正在尝试使用的示例模板,可以帮助我开始做作业。如果你们中的任何人对为什么不编译有任何见解,我将不胜感激。谢谢!!

键值对.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

键值对.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;
}

主文件

#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; 
}
4

3 回答 3

0

去掉后面的分号template<class key, class value>

                                !--here
template<class key, class value>; 
keyValuePair<key, value>::keyValuePair()
{
}
于 2013-02-08T20:06:19.417 回答
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 的值分配给通过引用获取的参数。我不认为这是您想要看到的,因为该函数被命名为 set。

模板类成员函数的主体通常在行中声明的原因是编译器只会为特定类型或类型生成代码(称为为特定类型实例化模板),如果它看到它们在该编译单元中使用(通常一个编译单元和一个 .cpp 文件是一回事)。

这意味着如果您将函数体放在 keyValuePair.cpp 中并尝试在 main.cpp 中使用它们,则链接器会给您“未找到”错误,因为在编译单元 keyValuePair.cpp 中编译器看不到它们被使用所以它从未创造过它们。

您可以像这样直接为特定类型实例化模板:

template keyValuePair<int,long>;

然而,这可能是一种不好的风格,因为每次您想使用带有新类型的模板时,您都需要将这些声明添加到您的 keyValuePair.cpp 文件中,这首先破坏了具有灵活性的目的。

于 2013-02-08T20:07:44.120 回答
0

您在语法上有几个小错误。

  • 您声明setKvar并按setVvar值获取参数,但定义它们以获取引用。(删除&.cpp 文件)

  • 后面不要加分号template<class key, class value>

  • setKvarand中setVvar,您在作业中交换了参数。它应该像kvar = object1;insetKvar和类比vvar = object2;insetVvar

  • 头文件中不要包含cpp文件,直接将内容包含到头文件中,就像PorkyBrain说的那样。

于 2013-02-08T20:07:51.100 回答