这是交易。我看过这个论坛,我没有找到我正在搜索的信息,或者我可能无法为我的问题重复这些信息。我有一个类通用表,我有一个名为MyString的类。
template <typename typeGen, int DIM>
class Table {
public:
TableauGenerique() : index_(0) { //On initialise courant à 0
}
void add(typeGen type);
private:
typeGen tableGen_[DIM];
int index_;
};
我的问题在于添加功能。 我有时必须在main.cpp中执行此操作:(效果很好)
Table <float,6> tabFloat;
tabFloat.add(1.6564);
并且在某一点上,我需要这样做,这是行不通的,因为我需要专门使用add函数来创建MyString的对象,将它传递给字符串,然后将对象存储在数组中(tableGen):
TableauGenerique <MyString,4> tabString;
所以我尝试了这个(课后),没有成功。
template <typename typeGen, int DIM>
void Table<typeGen,DIM>::add(typeGen type){ //Which is the generic one for float or ints
if(index_ < DIM) {
tableGen_[courant_] = type;
index_++;
}
}
template <class typeGen, int DIM>
void Table<typeGen,DIM>::add<string>(typeGen type) { //(line 75) Which is the specific or specialized function for myString
MyString str(type);
if(index_ < DIM) {
tableGen_[courant_] = str;
index_++;
}
}
那么,我怎样才能使这个工作,因为它根本不编译,说:line75:错误:'&lt;'之前的预期初始化程序令牌和主要说它不匹配函数来调用Table :: add(const char [6]),
我希望一切都清楚。如果有些事情不清楚,请告诉我。
非常感谢你的帮助!
答案 0 :(得分:2)
template <class typeGen, int DIM>
void Table<typeGen,DIM>::add<string>(typeGen type)
你试图专门化add()
,而实际上它不是一个开始的函数模板。你期望它如何运作?
你可能意味着:(班级的专业化)
template <int DIM>
void Table<string,DIM>::add(string type)
但是只有当你专门研究这个类本身时才允许这样做。没有专门化的类,上面的代码会给出编译错误!
编辑:
您可以阅读以下在线教程:
答案 1 :(得分:0)
如果您可以控制MyString
类的代码,则可以提供充当从float
到MyString
的隐式转换的构造函数。一个例子:
#include <string>
#include <sstream>
#include <iostream>
class MyString {
public:
MyString(float number) {
std::stringstream buffer;
buffer << number;
value = buffer.str();
}
void print() {
std::cout << value << std::endl;
}
private:
std::string value;
};
template <class T>
class Foo {
public:
void DoStuff(T item) {
item.print();
}
};
int main() {
Foo<MyString> foo;
foo.DoStuff(1.342); // implicitly converts float to MyString
return 0;
}
这样,您不需要任何add方法的专业化。但是,隐式转换很棘手,并且您要小心不要意外地调用它们,并且它们可能会产生歧义。
答案 2 :(得分:0)
Table<MyString,4> tabString;
tabString.add(MyString("whatever"));
因此过度和/或没有解决问题。随意忽略:))
我会使用泛型方法扩展类Table,以添加一些可以构造所需类型对象的东西:
template <typename typeGen, int DIM>
class Table {
public:
Table() : index_(0) {}
void add(typeGen type);
// The additional method
template<typename T> void add(const T& src);
private:
typeGen tableGen_[DIM];
int index_;
};
template<typename typeGen, int DIM>
template<typename T>
void Table<typeGen,DIM>::add(const T& src) {
if(index_ < DIM) {
tableGen_[courant_] = typeGen(src);
index_++;
}
}
注意在赋值之前构造临时typeGen对象。 假设MyString对象可以从字符串文字构造,即从const char *构造,则可以按如下方式使用它:
Table<MyString,4> tabString;
tabString.add("whatever");
或者如果上面的假设是错误的,下面的内容可能会起作用(因为你从字符串实例构造了一个MyString实例):
tabString.add(string("whatever"));