2015-07-22 16 views
8

Bir ikame hatası problemim var ve bazı benzer soruların cevapları bana yardım etmiyor. İşte Aday şablon göz ardı: ikame hatası (clang ile hata ama g ++ değil)

kodudur:

template<int dim, int loop> 
class Reference{ 
public: 
    //... 
    template<int r, int c> using matrix_t = int[r][c]; 
    Reference(const matrix_t<dim, loop> &mat){} 
}; 

template<int dim, int loop> 
class Partition{ 
    // ... 
public: 
    // ... 
    template<int r, int c> using matrix = int[r][c]; 
    template<int r, int c> void readPattern(const matrix<r,c> &pattern) 
    { 
     // ... 
    } 
    // ... 
}; 

Ve şöyle bu şablon işlevi çağırmak: g ++ kullanarak

int main() 
{ 
    // ... 
    const int DENOISE_UR[3][4] = {/*...*/}; 
    Partition<1,2> partition; 
    partition.readPattern(DENOISE_UR); 
    // ... 
} 

, bu derler.

error: no matching function for call to 'readPattern' 
    note: candidate template ignored: substitution failure[ with r = 3, c = 4 ] 
     template<int r, int c> void readPattern(const matrix<r,c> &pattern) 

Neden: (clang++ -std=c++11 xxx.cpp) derlemeye ++ (linux) clang kullanırken

, aşağıdaki derleme hata ile sonuçlandı?

+1

oO, (http [derler]: // melpon.org/wandbox/permlink/xx2K1gu0J4PFutiP) ... – Columbo

+0

@ Colombo Tam olarak sorunun ne olduğunu. 'Partition' sınıfındaki 'Reference' sınıfını kullanmam gerekiyor – Shindou

+1

@Columbo İlk takma adı şablonunu "long [r] [c]" olarak değiştirin: http://melpon.org/wandbox/permlink/0DHbcs3C0dm9H3gX ò.Ó – dyp

cevap

4

Bu argoda bir böcek; Bir dizi türünü tanımlayan bir takma ad şablonu bir sınıf şablonunda tanımlandığında yanlış davranır. Aslında crash the compiler için kullanılabilir:

namespace impl { template<int r, int c> using matrix_t = int[r][c]; } 
// ... 
template<int dim, int loop> 
class Reference { 
    //... 
    template<int r, int c> using matrix_t = impl::matrix_t<r, c>; 
: sizin durumunuzda Reference::matrix_t Reference şablon argümanları bağlı olmadığından

template<int I> 
struct S { 
    template<int J> using T = int[J]; 
    using U = T<I>; 
}; 
S<3>::U a; 

, en basit çözüm kapsamını ad alanı matrix_t tanımını taşımak olacaktır

:

Aslında, hatta hata geçici çözüm için kullanımimpl::matrix_t gerekmez 10


Bu now fixed olduğu (düzeltme çınlama yayın sürümünde 3.8.0 olmalıdır): Eğer Reference` `tanımını kaldırırsanız

[AST] Perform additional canonicalization for DependentSizedArrayType

We treated DependentSizedArrayTypes with the same element type but differing size expressions as equivalently canonical. This would lead to bizarre behavior during template instantiation.

This fixes PR24212.

+0

Evet ... Sadece alakasız 'isim alanı sihrinin eklenmesi, hataya bir çözüm getirecek ... Üzgünüm, İngilizce ile pek iyi değilim, ama ne yaparım? el yok demek? – Shindou

+0

@Shindou benim çok çılgın tahminim, clang'ın bir takma ad şablonuyla bir sarkan referansla sona ermesi ve "isim alanı sihri" nin eklenmesi, sarkan referansın bir şeye işaret etmesini sağlar. "Bak anne, el yok" bir şaka - Bisiklete binerken ve ellerini gidondan çekerken söylediklerin. :) – ecatmur

İlgili konular