这是我关于StackOverflow的第一个问题。我搜索了类似的“找不到标识符”错误,但找不到任何有用的信息。感谢您的帮助,因为我一直在努力2个小时,没有任何结果。
它基本上会创建一个类型为“Addition”的对象,并打印“1 +1 = 2”(如果可行)。
当我不使用模板时,它工作正常。但是,当我将所有内容更改为模板时,它停止工作。我不知道这个。
Visual Studio不会在红色下划线,但是对于m_Argument_1和m_Argument_2我收到“未定义标识符”错误。
谢谢您的帮助,如果在这里问的这个问题太简单,我深表歉意,但尽管如此,我仍然找不到解决方法或找出问题所在。
这是我的头文件“Expression.h”:
#ifndef OPERATION_HEADER
#define OPERATION_HEADER
#include <string>
#include <iostream>
template <typename T>
class Expression
{
protected:
char m_ExpressionSign; /* Represents Expression's Sign ('+','-','*','/') */
T m_Argument_1; /* Represents L Argument */
T m_Argument_2; /* Represents R Argument */
public:
Expression(T arg_1, T arg_2, char expressionSign) : m_Argument_1(arg_1), m_Argument_2(arg_2), m_ExpressionSign(expressionSign) { };
virtual T Result() const = 0;
virtual void Print(std::ostream& out) const;
friend std::ostream& operator << (std::ostream& out, const Expression<T>& expression);
};
template <typename T>
class Addition : public Expression<T>
{
public:
Addition(T arg1, T arg2) : Expression<T>(arg1, arg2, '+') {};
T Result() const { return m_Argument_1 + m_Argument_2; };
};
template <typename T>
void Expression<T>::Print(std::ostream& out) const
{
out << m_Argument_1 << " " << m_ExpressionSign << " " << m_Argument_2 << " = ";
}
template <typename T>
std::ostream& operator << (std::ostream& out, const Expression<T>& expression)
{
expression.Print(out);
return out;
}
#endif /* OPERATION_HEADER */
这是我的main.cpp:
#include <iostream>
#include <iomanip>
#include "Expression.h"
int main(int argc, char** argv)
{
Addition<int> A2(1, 1);
std::cout << "A2: " << A2 << " = " << std::setw(2) << A2.Result() << std::endl;
retun 0;
}
最佳答案
从类模板继承时,需要对标识符进行限定,以便编译器知道它们来自何处。在这种情况下,可以在Addition
的定义中执行以下操作:
T Result() const { return this->m_Argument_1
+ this->m_Argument_2; };
或者,您可以使用以下方式限定名称:
T Result() const { return Expression<T>::m_Argument_1
+ Expression<T>::m_Argument_2; };
关于c++ - 从子类访问模板类成员时找不到标识符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62159121/