Saya menggunakan gcc 4.7.3 untuk platform ARM untuk mengkompilasi kode saya. Saya memiliki beberapa kelas seperti ini:
// types.h
enum Types
{
kType1,
kType2
// ...
};
// d1.h
class D1 : public Base
{
public:
static const int type = kType1;
// ...
};
// d2.h
class D2 : public Base
{
public:
static const int type = kType2;
// ...
};
Di suatu tempat di sumber saya menggunakan kelas-kelas itu:
MyObject obj;
doSomething<D1>(obj);
doSomething<D2>(obj);
// other.cpp
class Foo
{
template<typename T>
void doSomething(MyObject obj)
{
mm_.insert(std::multimap<int, MyObject>::value_type(T::type, obj));
}
};
Dan dapatkan pesan berikutnya (saat menghubungkan):
undefined reference to `D1::kType`
undefined reference to `D2::kType`
// more messages of this type
OKE. Jika saya mengubah fungsi do_something seperti ini:
template<typename T>
void doSomething(MyObject obj)
{
mm_.insert(std::multimap<int, MyObject>::value_type( (int) T::type, obj));
}
itu dikompilasi dengan OK. Tapi kenapa? Tidak dapat menemukan apa pun dalam standar tentang hal itu. Adakah yang punya ide tentang apa yang terjadi?
Terima kasih.
P.S.
Perbaikan ini
// d1.cpp
const int D1::kType;
juga berfungsi, tetapi ini diharapkan.
PPS jawabannya akan cukup jelas jika menggunakan referensi atau penunjuk ke T::type, tapi saya tidak melihat apa pun yang memerlukan ref atau ptr. AFAIK std::multimap::value_type ambil argumen berdasarkan nilai (bukan ref, atau ptr).
D1::kType
, itulah yang diminta template Anda. - person Mats Petersson   schedule 03.07.2013std::multimap<T,U>::value_type
adalahstd::pair<const T,U>
yang konstruktornya mengambilconst& T, const& U
. FWIW. - person rici   schedule 03.07.2013