【问题标题】:Error calling a base class method from a derived class object. Both base and derived classes are templated从派生类对象调用基类方法时出错。基类和派生类都是模板化的
【发布时间】:2017-06-12 19:54:58
【问题描述】:

我正在使用模板练习一些 C++ 继承概念。我写了这个基类:

template <typename type1, typename type2>
class baseClass {
private:
    type1 member1;
    type2 member2;

public:
    baseClass() {};
    baseClass(type1 member1, type2 member2):member1(member1), member2(member2) {};
    type1 get_member1();
    type2 get_member2();
    ~baseClass() {};
};

还有一个派生类:

template <typename type1, typename type2, typename type3>
class derivedClass : public baseClass<type1, type2> {
private:
    type3 member3;
public:
    derivedClass(){};
    derivedClass(type1 member1, type2 member2, type3 member3): baseClass<type1, type2>(member1, member2), member3(member3){};
    type3 get_member3();
};

我正在从主函数进行此操作:

int main(int argc, const char * argv[]) {
    derivedClass<int, int, int> object(1, 2, 3);
    cout << object.get_member1() << endl;
    cout << object.get_member1() << " " << object.get_member2() << " " << object.get_member3() << endl;
}

当我尝试编译上述程序时,编译器出错。我尝试在网上搜索这个问题,但没有得到任何具体的答案。我是 C++ 模板的新手,还不知道如何处理它们。请帮我弄清楚。谢谢!

编辑:get_member* 方法的定义:

template <typename type1, typename type2>
type1 baseClass<type1, type2>::get_member1() {
    return member1;
}

template <typename type1, typename type2>
type2 baseClass<type1, type2>::get_member2() {
    return member2;
}

template <typename type1, typename type2, typename type3>
type3 derivedClass<type1, type2, type3>::get_member3() {
    return member3;
}

【问题讨论】:

  • 什么错误?链接器?
  • 缺少get_member1()get_member2() 的定义
  • 嗯,是的,如果您在此处显示的代码就是您所拥有的,那么您缺少 get_... 方法的定义。
  • 那些函数是在另一个cpp文件中定义的。
  • 这是我得到的错误:Undefined symbols for architecture x86_64: "derivedClass&lt;int, int, int&gt;::get_member3()", referenced from: _main in mainFile.o "baseClass&lt;int, int&gt;::get_member1()", referenced from: _main in mainFile.o "baseClass&lt;int, int&gt;::get_member2()", referenced from: _main in mainFile.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

标签: c++ templates inheritance


【解决方案1】:

请看这里:corrected-code

#include <iostream>
using namespace std;

template <typename type1, typename type2>
class baseClass {
private:
    type1 member1;
    type2 member2;

public:
    baseClass() {}
    baseClass(type1 member1, type2 member2):member1(member1), member2(member2) {}
    type1 get_member1(){return member1;}
    type2 get_member2(){return member2;}
    virtual ~baseClass() {};
};

template <typename type1, typename type2, typename type3>
class derivedClass : public baseClass<type1, type2> {
private:
    type3 member3;
public:
    derivedClass(){};
    derivedClass(type1 member1, type2 member2, type3 member3):     baseClass<type1, type2>(member1, member2), member3(member3){};
    type3 get_member3() {return member3;}
    ~derivedClass(){}
};


int main(int argc, const char * argv[]) {
    derivedClass<int, int, int> object(1, 2, 3);
    cout << object.get_member1() << endl;
    cout << object.get_member1() << " " << object.get_member2() << " " <<    object.get_member3() << endl;
    return 0;
}

【讨论】:

  • 嘿,在类中定义 get_member 函数可以解决问题,但是请您帮我理解我在单独的 cpp 文件中声明函数时出了什么问题。我在更新的问题中添加了代码。谢谢!
  • 您可能希望在头文件中提供 baseClass 和 derivedClass 的声明,并使用另一个 .cpp 文件添加函数的定义。不要忘记在 .cpp 文件中包含头文件。
  • 是的,现在就是这样。不工作。我在cpp文件中定义函数的方式有问题吗?
  • @Monster,请说明为什么答案不被接受?
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 2016-08-17
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多