簡體   English   中英

未使用的模板方法出錯

[英]error in unused template method

struct B
{
    int a;
    void foo() {a = 5;}
};

template <typename T>
struct A
{
    A(int i) { B::foo(); }
    A(double d) {}
};

int main()
{
    A<int> a(5.0);
}

gcc 4.7.2編譯它沒有錯誤。 clang 3.4svn抱怨:

$ clang -Wall -Wextra test.cpp 
test.cpp:10:16: error: call to non-static member function without an object argument
        A(int i) { B::foo(); }
                   ~~~^~~

當然代碼是錯誤的,但哪個編譯器符合標准?

同樣奇怪的是,如果使用5而不是5.0,則clang不會像gcc那樣打印任何“實例化”注釋:

$ gcc test.cpp 
test.cpp: In instantiation of ‘A<T>::A(int) [with T = int]’:
test.cpp:15:12:   required from here
test.cpp:9:13: error: cannot call member function ‘void B::foo()’ without object

您的程序不正確,並且兩個編譯器都是正確的,因為標准不需要來自符合編譯器的診斷(讓gcc忽略它)。 即使該模板從未實例化,也可能沒有有效實例化(標准術語中的特化)的模板不正確。

在您的情況下, A<T>::A(int)的名稱B::foo()是非依賴名稱,因此需要在第一階段查找期間解析它,並且它只能引用B上面定義的類。 因為它不是一個static成員函數,但非靜態一個,代碼是不正確,無論其類型T用於實例化A<T>模板和程序是非法的構造。

相關報價來自14.6 [temp.res] / 8:

知道哪些名稱是類型名稱允許檢查每個模板定義的語法。 不能為可以生成有效特化的模板定義發出診斷。 如果無法為模板定義生成有效的專業化,並且未實例化該模板,則模板定義格式錯誤,無需診斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM