ฉันใช้ gcc 4.7.3 สำหรับแพลตฟอร์ม ARM เพื่อรวบรวมโค้ดของฉัน ฉันมีหลายชั้นเรียนเช่นนี้:
// 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;
// ...
};
ฉันใช้คลาสเหล่านั้นที่ไหนสักแห่งในแหล่งที่มา:
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));
}
};
และรับข้อความถัดไป (ระหว่างการเชื่อมโยง):
undefined reference to `D1::kType`
undefined reference to `D2::kType`
// more messages of this type
ตกลง. ถ้าฉันเปลี่ยนฟังก์ชัน do_something เช่นนี้:
template<typename T>
void doSomething(MyObject obj)
{
mm_.insert(std::multimap<int, MyObject>::value_type( (int) T::type, obj));
}
มันคอมไพล์ตกลง แต่ทำไม? ไม่พบสิ่งใดในมาตรฐานเกี่ยวกับเรื่องนี้ ใครมีความคิดเกี่ยวกับสิ่งที่เกิดขึ้น?
ขอบคุณ.
P.S.
การแก้ไขนี้
// d1.cpp
const int D1::kType;
ใช้งานได้เช่นกัน แต่คาดว่าจะเป็นเช่นนั้น
พี.พี.เอส. คำตอบจะค่อนข้างชัดเจนในกรณีที่ใช้การอ้างอิงหรือตัวชี้ไปที่ T::type แต่ฉันไม่เห็นสิ่งใดที่ต้องใช้การอ้างอิงหรือ ptr AFAIK std::multimap::value_type รับอาร์กิวเมนต์ตามค่า (ไม่ใช่การอ้างอิงหรือ ptr)
D1::kType
ซึ่งเป็นสิ่งที่เทมเพลตของคุณขอ - person Mats Petersson   schedule 03.07.2013std::multimap<T,U>::value_type
คือstd::pair<const T,U>
ซึ่งตัวสร้างใช้เวลาconst& T, const& U
FWIW. - person rici   schedule 03.07.2013