2015-10-08 28 views
0

我想在Ada中創建一個枚舉類型的向量,但編譯器似乎期望一個相等函數重載。我如何通過編譯器來使用默認的平等函數。下面是我有:枚舉類型的Ada向量

package HoursWorkedVector is new Ada.Containers.Vectors(Natural,DAY_OF_WEEK); 
--where Day of week is defined as an enumeration 

當我嘗試編譯,我得到的消息:

no visible subprogram matches the specification for "=" 

我需要建立一個比較函數有一個枚舉類型的載體?提前致謝。

+0

DAY_OF_WEEK是否與HoursWorkedVector在同一個包中定義?另外,DAY_OF_WEEK是否是重命名聲明? – ajb

+0

我之前評論中的「重命名聲明」是一個錯誤。我應該問,是DAY_OF_WEEK的子類型聲明? – ajb

+2

您能否發佈導致錯誤的[最小完整可驗證示例](http://stackoverflow.com/help/mcve)?現在,我認爲我們錯過了太多的信息。 – ajb

回答

3

Ada.Containers.Vectors開始這樣的定義:

generic 
    type Index_Type is range <>; 
    type Element_Type is private; 
    with function "=" (Left, Right : Element_Type) 
     return Boolean is <>; 
package Ada.Containers.Vectors is 

<>在一個通用的正式功能的含義由RM 12.6(10)定義:

如果一個通用單元有一個subprogram_default由一個方框指定,並且相應的實際參數被忽略,那麼它相當於一個 明確的實際參數,該參數的用法名稱與定義正式名稱的 相同。

所以,如果你在評論中說,DAY_OF_WEEK在另一個包中定義的,你的實例相當於

package HoursWorkedVector is new Ada.Containers.Vectors(Natural, Other_Package.DAY_OF_WEEK, "="); 

不工作,因爲這比較DAY_OF_WEEK"="是不可見。

您可以在實例中包含Other_Package."=",如評論中所建議的。至少有三種方法可以使"="可見,讓你原來的實例會工作:

  1. use Other_Package;這將使"="直接可見的,但它也將讓一切在包直接可見的定義。這可能不是你想要的。

  2. use type Other_Package.DAY_OF_WEEK;這使得DAY_OF_WEEK直接看到所有的運營商,包括"<""<="等,以及所有的枚舉文字,那你可能在Other_Package已經宣佈DAY_OF_WEEK任何其他原始子程序。這可能是最受歡迎的解決方案,除非出於某種原因,使枚舉文字可見是個問題。

  3. 使用重命名聲明重新定義"="

    function "=" (Left, Right : DAY_OF_WEEK) return Boolean renames Other_Package."=";

    這使得"="直接可見。

0

編譯器自動選擇預定義的相等運算:

with 
    Ada.Containers.Vectors; 

package Solution is 
    type Day_Of_Week is (Work_Day, Holiday); 

    package Hours_Worked_Vector is 
    new Ada.Containers.Vectors (Index_Type => Natural, 
           Element_Type => Day_Of_Week); 
end Solution;