#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。
我没有看到实例化语法有什么问题。有人可以 帮帮我...
答案 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
}