从基类访问派生类的非成员函数

时间:2010-06-22 01:58:07

标签: c++ inheritance membership

我正在尝试从基类调用派生类的非成员函数,但是收到此错误:

  

错误:没有匹配函数来调用'generate_vectorlist(const char&)'

以下是基类的相关代码片段:

//Element.cpp
#include "Vector.h"
    ...

string outfile;
cin >> outfile;
const char* outfile_name = outfile.c_str();
generate_vectorlist(*outfile_name); //ERROR
...

和派生类(这是一个模板类,所以标题中的所有内容):

//Vector.h 
    template <class T>
void generate_vectorlist(const char* outfile_name = "input.txt" )
{
    std::ofstream vectorlist(outfile_name);
    if (vectorlist.is_open())
        for (Element::vciter iter = Element::vectors.begin(); iter!=Element::vectors.end(); iter++) 
        {
            Vector<T>* a = new Vector<T>(*iter);
            vectorlist << a->getx() << '\t' << a->gety() << '\t'<< a->getz() << std::endl;
            delete a;
        }
    else { std::cout << outfile_name << " cannot be opened." << std::endl;}
    vectorlist.close();
}

我的猜测是我只缺少一个小语法。有什么想法吗?

5 个答案:

答案 0 :(得分:3)

你正在取消引用指针,所以你要传递一个const char,而不是一个const char *。

试试这个:

generate_vectorlist(outfile_name);

答案 1 :(得分:3)

你有两个问题:

  1. generate_vectorlist需要const char *,而不是const char &

  2. 模板类型不在函数签名中,因此编译器无法推断出类型,因此需要指定它(在我的示例中使用int)。

  3. 所以你需要这样做:

    generate_vectorlist<int>(outfile_name);
    

答案 2 :(得分:1)

在第一位,尝试:     generate_vectorlist(outfile_name);

你应该传递一个字符指针,而不是一个字符。

答案 3 :(得分:1)

您需要指定模板参数。编译器无法用来推断出T的类型。因此,您必须使用generate_vectorlist<MyType>(outfile_name);的相应类型将其称为MyType

答案 4 :(得分:1)

这是问题所在:

template <class T>
void generate_vectorlist(const char* outfile_name = "input.txt" )

编译器无法推断出T的类型,因此不知道使用哪个generate_vectorlist

这样称呼:

generate_vectorlist<vectortype>(outfile_name);

虽然我实际上建议这段代码首先没有任何意义。