【问题标题】:How to construct a templated struct according to this example?如何根据这个例子构造一个模板化的结构?
【发布时间】:2021-01-02 13:57:18
【问题描述】:

目前我正在学习模板和结构。我需要完成以下任务:

使用静态 eval() 创建一个结构模板 ConstInt 返回整数常量值的方法。

例子:

typedef ConstInt<4> a; // represents the function a(x) = 4

我尝试执行以下操作:

template<int value>
struct ConstInt
{
    static int  eval(int x)
    {
        return x; 
    };
};

但这似乎没有给出正确的输出。当我尝试在 main() 中执行时,它会出错:

typedef ConstInt<4> a;

错误:typedef 'a' 本地定义但未使用

我收到一个错误,但我不确定此尝试是否真的有助于完成任务。

【问题讨论】:

  • 这是第一个警告,您没有在任何地方使用a。因此,只需在 main() 中放置类似 int y = a::eval(); 的行即可。该警告可能被视为错误,因为您有带有编译器标志的-Werror

标签: c++


【解决方案1】:

如果我正确理解您的问题,这就是您所需要的:

template<int value>
struct ConstInt
{
    static int  eval()
    {
        return value; // This returns the const value of a template parameter
    };
};

然后,你可以输入def:

typedef ConstInt<4> a;

你可以像这样使用新的 typedef-ed a:

std::cout << a::eval();

它会将数字4 打印到您的屏幕上。

或者,你可以避免 typedef。

std::cout << ConstInt<4>::eval();

【讨论】:

    【解决方案2】:

    这个程序只会返回 0 作为退出值。

    template <int value>
    struct ConstInt
    {
       static int eval()
       {
          return value;
       };
    };
    
    int main()
    {
       typedef ConstInt<4> a;
       return a().eval() - a::eval();
    }
    

    这里a 是本地定义的,但它也以不同的方式在下一行使用两次。

    【讨论】:

    • a().eval(); 不应该是a::eval();吗??
    • @πάνταῥεῖ,这也有效:-)。但是你也可以在对象上调用静态成员函数。
    • 当然可以,但会不必要地混淆 IMO 的实际情况。
    【解决方案3】:

    我收到一个错误,但我不确定此尝试是否真的有助于完成任务。

    你得到的错误,对于你的代码的正确性有点误导。

    error: typedef 'a' locally defined but not used
    

    说明你没有使用你创建的 typedef。这可以通过使用它来解决。 这是正常情况下的编译器警告,但如果您将编译器指令设置为将警告作为错误处理(例如 -Werror 与 g++),则会被视为错误。

    真正的问题是您在定义eval() 时使用了一个参数,但您不需要一个参数,而且您在调用示例中提到的函数时也没有一个参数。

    正确的结构定义和用法应该是这样的:

    #include <iostream>
    
    template<int value>
    struct ConstInt {
        static int  eval() {
            return value; // the velue is already given as template parameter
        };
    };
    
    int main() {
        typedef ConstInt<4> a;
        int x = a::eval();
        std::cout << x << std::endl;
    }
    

    请参阅live demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多