Blob Blame History Raw
Index: lily/all-font-metrics.cc
diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc
index ab4f2a4ce4e3a09651b674a8f9598e2cdd6699f5..a560a25940b5dbd065d50ed6ad8d81f6af6b6782 100644
--- a/lily/all-font-metrics.cc
+++ b/lily/all-font-metrics.cc
@@ -27,6 +27,8 @@
 #include "scm-hash.hh"
 #include "warn.hh"
 
+const char * const All_font_metrics::type_p_name_ = 0;
+
 Index_to_charcode_map const *
 All_font_metrics::get_index_to_charcode_map (const string &filename,
                                              int face_index,
Index: lily/include/all-font-metrics.hh
diff --git a/lily/include/all-font-metrics.hh b/lily/include/all-font-metrics.hh
index a2d090a6dfd71c7567447e5ff75dd87ece76f756..f206a3b95d7ec375f6a864c44a8aab7b43170e05 100644
--- a/lily/include/all-font-metrics.hh
+++ b/lily/include/all-font-metrics.hh
@@ -48,6 +48,7 @@ class All_font_metrics : public Smob<All_font_metrics>
 
   All_font_metrics (All_font_metrics const &);
 public:
+  static const char * const type_p_name_; // = 0
   SCM mark_smob () const;
 
   Index_to_charcode_map const *get_index_to_charcode_map (const string &filename,
Index: lily/include/listener.hh
diff --git a/lily/include/listener.hh b/lily/include/listener.hh
index 00a64eebb892db03b4231cb983e413c9a4051d34..27e7d85b719d70eb8f8d5aa101f60720ea3baeb5 100644
--- a/lily/include/listener.hh
+++ b/lily/include/listener.hh
@@ -179,6 +179,7 @@ class Callback_wrapper : public Simple_smob<Callback_wrapper>
   Callback_wrapper (void (*trampoline) (SCM, SCM)) : trampoline_ (trampoline)
   { } // Private constructor, use only in make_smob
 public:
+  static const char * const type_p_name_; // = 0
   LY_DECLARE_SMOB_PROC (&Callback_wrapper::call, 2, 0, 0)
   SCM call (SCM target, SCM ev)
   {
Index: lily/include/paper-outputter.hh
diff --git a/lily/include/paper-outputter.hh b/lily/include/paper-outputter.hh
index cd1a5e2c92fb4ffb34a0581f85398750c1276d28..8683b4c6d10dd5f04531e40691c3bad00228890f 100644
--- a/lily/include/paper-outputter.hh
+++ b/lily/include/paper-outputter.hh
@@ -33,6 +33,7 @@
 class Paper_outputter : public Smob<Paper_outputter>
 {
 public:
+  static const char * const type_p_name_; // = 0
   SCM mark_smob () const;
   virtual ~Paper_outputter ();
 private:
Index: lily/include/scale.hh
diff --git a/lily/include/scale.hh b/lily/include/scale.hh
index 19cd175c797fd7d9e63a5ac79dbb8c73696c1fa0..7c990e503419ce7db183489fae7ce90c0074d092 100644
--- a/lily/include/scale.hh
+++ b/lily/include/scale.hh
@@ -26,6 +26,7 @@
 
 struct Scale : public Smob<Scale>
 {
+  static const char * const type_p_name_; // = 0
   virtual ~Scale ();
   Scale (vector<Rational> const &);
   Scale (Scale const &);
Index: lily/include/scm-hash.hh
diff --git a/lily/include/scm-hash.hh b/lily/include/scm-hash.hh
index 3453904f7152cf3c8cfe60b652fca9892803637a..241f316c4ec3dd622ed493936a5dcf63b36f3447 100644
--- a/lily/include/scm-hash.hh
+++ b/lily/include/scm-hash.hh
@@ -46,6 +46,7 @@
 class Scheme_hash_table : public Smob1<Scheme_hash_table>
 {
 public:
+  static const char * const type_p_name_; // = 0
   int print_smob (SCM, scm_print_state *) const;
   bool try_retrieve (SCM key, SCM *val);
   bool contains (SCM key) const;
Index: lily/include/smobs.hh
diff --git a/lily/include/smobs.hh b/lily/include/smobs.hh
index 9ccaa61345565a02a4a50d5ac6d402389993b934..889d86a8cab3a342b374593a7a6afa1879d98f9f 100644
--- a/lily/include/smobs.hh
+++ b/lily/include/smobs.hh
@@ -185,18 +185,11 @@ private:
   static int print_trampoline (SCM, SCM, scm_print_state *);
   static void smob_proc_init (scm_t_bits) { };
 
-  // type_p_name_ can be overriden in the Super class with a static
-  // const char [] string.  This requires both a declaration in the
-  // class as well as a single instantiation outside.  Using a
-  // template specialization for supplying a different string name
-  // right in Smob_base<Super> itself seems tempting, but the C++
-  // rules would then require a specialization declaration at the
-  // class definition site as well as a specialization instantiation
-  // in a single compilation unit.  That requires just as much source
-  // code maintenance while being harder to understand and quite
-  // trickier in its failure symptoms when things go wrong.  So we
-  // just use a static zero as "not here" indication.
-  static const int type_p_name_ = 0;
+  // type_p_name_ has to be defined in the Super class, either with a
+  // static const char [] string or as a null pointer of type const
+  // char *.  We used to provide a default here for convenience, but
+  // battling the various conflicting C++ standards was too much of a
+  // hassle.
 
   // LY_DECLARE_SMOB_PROC is used in the Super class definition for
   // making a smob callable like a function.  Its first argument is a
Index: lily/include/translator-dispatch-list.hh
diff --git a/lily/include/translator-dispatch-list.hh b/lily/include/translator-dispatch-list.hh
index 6c365d088effb2540559b99b2445849cc952e7b8..6fd03beecf050ce363338430753fb2a22991ac10 100644
--- a/lily/include/translator-dispatch-list.hh
+++ b/lily/include/translator-dispatch-list.hh
@@ -35,6 +35,7 @@ class Engraver_dispatch_list : public Simple_smob<Engraver_dispatch_list>
 {
   vector<Engraver_dispatch_entry> dispatch_entries_;
 public:
+  static const char * const type_p_name_; // = 0
   void apply (Grob_info);
   SCM static create (SCM trans_list,
                      SCM iface_list, Direction);
Index: lily/listener.cc
diff --git a/lily/listener.cc b/lily/listener.cc
index 2a8d28d8cbb6daa0d287eeccded86624f75fbb9d..c1e0b442e25dff095b30944d380adc7d3134ad89 100644
--- a/lily/listener.cc
+++ b/lily/listener.cc
@@ -19,4 +19,6 @@
 
 #include "listener.hh"
 
+const char * const Callback_wrapper::type_p_name_ = 0;
+
 const char Listener::type_p_name_[] = "ly:listener?";
Index: lily/paper-outputter.cc
diff --git a/lily/paper-outputter.cc b/lily/paper-outputter.cc
index a72ea59ccdef770d8f70c32f942a42ee4fe8a6d9..471a36a41a4572eb1941eb83ad4a27b244cb3c26 100644
--- a/lily/paper-outputter.cc
+++ b/lily/paper-outputter.cc
@@ -40,6 +40,8 @@ using namespace std;
 #include "lily-imports.hh"
 
 
+const char * const Paper_outputter::type_p_name_ = 0;
+
 Paper_outputter::Paper_outputter (SCM port, const string &format)
 {
   file_ = port;
Index: lily/scale.cc
diff --git a/lily/scale.cc b/lily/scale.cc
index 02c1dc5f8e2daca09b480ac977049c66e70d68e3..d6f566b9ed57517d28ae1ef2859d25438deff275 100644
--- a/lily/scale.cc
+++ b/lily/scale.cc
@@ -90,6 +90,8 @@ LY_DEFINE (ly_set_default_scale, "ly:set-default-scale",
   return SCM_UNSPECIFIED;
 }
 
+const char * const Scale::type_p_name_ = 0;
+
 int
 Scale::step_count () const
 {
Index: lily/scm-hash.cc
diff --git a/lily/scm-hash.cc b/lily/scm-hash.cc
index dd8f9257b933a93d9bfb92b7593180aa3cb16f7d..3eb40ada7bfe929576fc50cb1c081d368951b488 100644
--- a/lily/scm-hash.cc
+++ b/lily/scm-hash.cc
@@ -21,6 +21,8 @@
 
 #include <cassert>
 
+const char * const Scheme_hash_table::type_p_name_ = 0;
+
 SCM
 Scheme_hash_table::make_smob ()
 {
Index: lily/translator-dispatch-list.cc
diff --git a/lily/translator-dispatch-list.cc b/lily/translator-dispatch-list.cc
index 10bf06407598f452fffffd5b034caa42f7a2f7dc..41d5a171827ceb5bdf065d3eaf5eeebd0bcf1884 100644
--- a/lily/translator-dispatch-list.cc
+++ b/lily/translator-dispatch-list.cc
@@ -21,6 +21,8 @@
 #include "engraver.hh"
 
 
+const char * const Engraver_dispatch_list::type_p_name_ = 0;
+
 void
 Engraver_dispatch_list::apply (Grob_info gi)
 {
Index: lily/unpure-pure-container.cc
diff --git a/lily/unpure-pure-container.cc b/lily/unpure-pure-container.cc
index 0e389d4bcd087bf291413155e3398436393b9a17..7a7d6d48d16d3c139aca38ad9f0f38f307b5debb 100644
--- a/lily/unpure-pure-container.cc
+++ b/lily/unpure-pure-container.cc
@@ -25,6 +25,7 @@
 class Unpure_pure_call : public Smob1<Unpure_pure_call>
 {
 public:
+  static const char * const type_p_name_; // = 0
   // Smob procedures unfortunately can only take at most 3 SCM
   // arguments.  Otherwise we could use a "3, 0, 1" call signature and
   // not require an argument count check of our own.
@@ -37,6 +38,8 @@ public:
   }
 };
 
+const char * const Unpure_pure_call::type_p_name_ = 0;
+
 SCM
 Unpure_pure_container::pure_part () const
 {