c++ - 从子类访问模板类成员时找不到标识符错误

标签 c++ compiler-errors

这是我关于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/

相关文章:

c++ - 在 VS2010 中使用 list_of 调用不明确

java - 我一直遇到错误,但是无论我做什么,我似乎都无法修复它们。

iPhone - ShareKit 、 SHKm 给出“找不到文件”的编译器错误

c++ - 错误(std::bad_array_new_length) in a 2d array textbook example (Absolute C++, Savitch)

c++ - 如何使用 text.hpp(可选模块)重新编译 OpenCV?

c++ - 为 GCC 4.5.3 模拟 nullptr & nullptr_t

c++ - 提供指向成员本身的成员指针

c++ - 如何使用广度优先搜索在 map 中找到最短路径?

c++ - 如何将变量放在内存中给定的绝对地址(使用 Visual C++)

c++ - 在 Eigen c++ 中,如何将 NxM 矩阵的每一行乘以 Nx1 标量的 vector ?