2016-07-08 4 views
0
#include <iostream> 
using std::cout; 


template<typename T> 
class A{ 
    public: 
    template<typename U> 
    void f(U const&) & ; 
    template<typename U> 
    void f(U const&) && ; 
}; 


    template<typename T> 
    template<typename U> 
    void A<T>::f(U const& x) & { std::cout << "lvalue object\n" ; } 
    template<typename T> 
    template<typename U> 
    void A<T>::f(U const& x) && { std::cout << "rvalue object\n" ; } 

// template class A<int> ; 
// template void A<int>::f<int>(int const&) & ; 
// template void A<float>::f<int>(int const&) &&; 


int main(){ 

    A<int> a ; 
      a.f<int>(2); // lvalue 
    A<float>().f<int>(1); // rvalue 
} 

код работает, за исключением, если я попытаюсь разбить его на отдельные-компиляции (* .hh, * .cc, * .ie и основной). Заявления (прокомментированные) выдадут компилятор ICE.ошибка шаблона конкретизации реф квалифицированных членов

Я не вижу ничего плохого в синтаксисе создания экземпляра. Может кто-то помочь мне в этом ...

+0

Что точная ошибка, которую вы получаете? На каком языке это, C? – Taegost

+0

C++, такая же проблема в gcc-4.9.3 и gcc-6.1.0 (которую btw компилирует для установки в четырехкратное время из 4.9.3). Ошибка, которую вы получаете, является странной, нет репликации точек. –

ответ

0

Код работает, кроме, если я попытаюсь разбить его на отдельные-компиляции (* .hh, * .cc, * .ie и основной).

С помощью шаблонов вы не можете отделить заголовок и реализацию. Это должно быть все в одном месте. Вы должны сделать что-то вроде этого (имейте в виду, я не проверял это):

A.hpp:

#include <iostream> 
using std::cout; 


template<typename T> 
class A{ 
    public: 
    template<typename U> 
    void f(U const&) & ; 
    template<typename U> 
    void f(U const&) && ; 
}; 

    // Consider just throwing this in the class definition itself 
    template<typename T> 
    template<typename U> 
    void A<T>::f(U const& x) & { std::cout << "lvalue object\n" ; } 
    template<typename T> 
    template<typename U> 
    void A<T>::f(U const& x) && { std::cout << "rvalue object\n" ; } 

main.cpp

#include "A.hpp" 

int main(){ 
    A<int> a; 
      a.f<int>(2); // lvalue 
    A<float>().f<int>(1); // rvalue 
} 
+0

Я знаю, что он работает цельно. Он не работает в отдельной компиляции. Я разделяю-компилирую шаблоны следующим образом: * .hh, * .cc (с включением в экземпляры шаблонов, которые я вызываю * .ie). Затем все компиляции, в конце, запускаются и входят в библиотеку. Мгновяет, сколько/много я хочу создать, конечно. Они идут в библиотеку (не более). –

+0

Вам придется разбить его так, как вы их разделяете (покажите нам, что в каждом файле). Если вы отделяете реализацию шаблона от определения класса шаблона, это не сработает. – AlexB

0
// ---------------- *.hh ------------ 

#include <iostream> 
using std::cout; 


#include <iostream> 

template<typename T> 
class A{ 
    public: 
    void f() & ; 
    void f() && ; 
    void g() ; 
    void g(int) ; 
}; 


// ---------- *.cc -- you compile this (no linking) just lib code ------ 
#include "e.hh" 

    template<typename T> 
    void A<T>::f() & { std::cout << "lvalue object\n" ; } 
    template<typename T> 
    void A<T>::f() && { std::cout << "rvalue object\n" ; } 

    template<typename T> 
    void A<T>::g() { std::cout << "lvalue object\n" ; } 
    template<typename T> 
    void A<T>::g(int x) { std::cout << "rvalue object\n" ; } 

extern template class A<int> ; 
//extern template class A<float> ; 
//template void A<int>::f(float const&) & ; 
//template void A<int>::f<int>() && ; 

template void A<int>::f() &; 
//template void A<float>::f() && ; 


template void A<int>::g() ;  // see ! ... these work ! 
template void A<int>::g(int) ; // ... but not the ref-qual ones 

// ---------------------- *.cc (main) -------------- 
// here you compile + link the previous one 
#include <iostream> 
#include "e.hh" 
using std::cout; 


int main(){ 

    A<int> a ; 
      a.f(); // lvalue 
// A<float>().f(); // rvalue 
      a.g(); // lvalue 
      a.g(3); // lvalue 
} 
+0

примечание - clang 3.8/C++ 11, 14, 17/работает ... это gcc, которого нет - bugzilla тоже медленно реагирует! ... Я бы переключился на Clang, но LLVM медленно. –