ref-qualified成员的模板实例化错误

时间:2016-07-08 13:22:30

标签: c++ templates ref-qualifier

#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和main)。 (已注释掉的)陈述将发布 编译器ICE。

我没有看到实例化语法有什么问题。有人可以 帮帮我...

2 个答案:

答案 0 :(得分:0)

  

代码运行,除非我尝试将其分解为单独编译(* .hh,*。cc,* .ie和main)。

使用模板,您无法分隔标头和实现。它必须在一个地方。你必须做这样的事情(记住,我还没有测试过这个):

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
}

答案 1 :(得分: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
}