2012-07-17 69 views
2

這是簡化的問題。如何避免實例化錯誤後的專業化?

template <class T> 
std::string name(const T&); // This is the template 
          // I want to explicitly specialize. 

class Outer 
{ 
    class Inner 
    { 
    }; 

    class Container : public ::Container<Inner> // This causes also an implicit 
               // specialization of f::name 
    { 
    }; 
}; 

我如何專注

template <class T> 
std::string name(const T&); 

Outer::Inner

我不能宣佈在三個地方我認爲是明確的分工:

template <class T> 
std::string name(const T&); 

// 1. Here I cannot forward declare a nested class 

class Outer 
{ 
    class Inner 
    { 
    }; 

    // 2. Here I get error: explicit specialization 
    // in non-namespace scope 'class Outer' 

    class Container : public ::Container<Inner> 
    { 
    }; 
}; 

// 3. Here I get error: specialization of '...' after instantiation 

我怎樣才能解決這個問題?

回答

2

看一看this article。您可能會更好,只需要爲要「專門化」的特定類型編寫name函數:

std::string name(const Outer::Inner&); 
+0

謝謝!現在我明白了,我很驚訝我的想法。只是超載會做,對吧?我也會看文章! – 2012-07-17 05:31:37

+0

還有一件事。我在哪裏宣佈重載?看來問題依然存在。由於與模板案例相同的原因,沒有地方。 – 2012-07-17 06:05:42

+0

您可以在任何需要的地方聲明它,並將其定義在.cpp中,就像任何其他函數一樣。如果在許多地方需要它,你可以爲它提供專用的.h和.cpp文件(你也可以使用'inline'將定義放在.h中) – juanchopanza 2012-07-17 07:17:54