如何使这个专业功能工作

时间:2011-03-20 19:39:26

标签: c++ templates

这是交易。我看过这个论坛,我没有找到我正在搜索的信息,或者我可能无法为我的问题重复这些信息。我有一个类通用表,我有一个名为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]),

我希望一切都清楚。如果有些事情不清楚,请告诉我。

非常感谢你的帮助!

3 个答案:

答案 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类的代码,则可以提供充当从floatMyString的隐式转换的构造函数。一个例子:

#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"));