首页 > 解决方案 > “通道”类型的字段给出错误“无法默认初始化具有泛型类型的变量”

问题描述

在这段代码中,我正在创建一个包含一个通道的类,该通道可以在初始化时根据请求打开。为此,我传递了一个标志来指示通道是否已打开(连同其文件名)。

class Myclass
{
    var writeflag : bool;
    var output : channel;

    proc init( writeflag = false, filename = "" )
    {
        this.writeflag = writeflag;
        if writeflag {                   // (1)
            assert( filename != "" );
            this.output = openwriter( filename );
        }                                // (2)
    }
}

proc main()
{
    var a = new owned Myclass( writeflag = true,
                               filename = "test.out" );
    a.output.writeln( 123 );
}

但是,编译器拒绝上述代码并显示以下消息:

myclass.chpl:6:错误:无法默认初始化具有泛型类型 myclass.chpl:6 的变量:注意:“未完全实例化”具有泛型类型“通道”

另一方面,如果我注释掉 (1) 和 (2),代码会按预期工作并创建“test.out”。我猜这个问题与(根据错误消息)的通用性质有关channel,但不太确定如何适当地编写这样的代码......

标签: filegenericschapel

解决方案


我猜这个问题与通道的通用性有关(根据错误消息),但不太确定如何正确编写这样的代码......

你在正确的轨道上。通道记录有一些必须在编译时提供的参数字段。您可以在字段声明中指定这些参数:

var output : channel(writing=true, kind=iokind.dynamic, locking=false);

推荐阅读