2011-05-05 67 views
1

我不明白爲什麼代碼的行爲是這樣嗎?函數超載錯誤

#include <iostream> 

#include <boost/fusion/container/vector.hpp> 
#include <boost/fusion/include/vector.hpp> 
#include <boost/fusion/container/vector/vector_fwd.hpp> 
#include <boost/fusion/include/vector_fwd.hpp> 
#include <boost/fusion/container/generation/make_vector.hpp> 
#include <boost/fusion/include/make_vector.hpp> 
#include <boost/fusion/sequence/io.hpp> 
#include <boost/fusion/include/io.hpp> 

template<typename Ar> 
void func(Ar& ar, const boost::fusion::vector<>& v) { 
    std::cout << v << std::endl; 
} 

template<typename Ar, typename T0, typename T1> 
void func(Ar& ar, const boost::fusion::vector<T0, T1>& v) { 
    std::cout << v << std::endl; 
} 

struct type { 
    template<typename T> 
    type& operator& (const T& v) { 
     func(*this, v); 
     return *this; 
    } 
}; 

int main() { 
    type t; 
    t & boost::fusion::make_vector(33,44); // 1. <<<<<<<<<<<<<<<<<<<<<<<< 

    boost::fusion::vector<int, int> v(55,66); // 2. 
    t & v; 
} 

test code here

的問題是,爲什麼在第一種情況下FUNC(),用於空載體被稱爲?

文檔關於這一主題:

boost::fusion::vector

boost::fusion::make_vector()

感謝的。

回答

3

這大約是我的理解......

boost::fusion::make_vector()從您的boost::fusion::make_vector(33,44)使用返回boost::fusion::vector2<int, int>類型而不是一個boost::fusion::vector<int, int, T2, T3,...>(可變參數)型。然而,boost::fusion::vectorN類型可以將其自身轉換爲boost::fusion::vector<>(variadic)類型。

第一個函數接受NO類型的可變參數。因此沒有顯示元素。第二個版本接受聲明瞭兩個模板類型的可變參數類型,但是由於第一個模板類型匹配得更好(因爲默認模板類型踢入了),所以在使用boost::fusion::make_vector時,它會在第二個模板類型中選擇。在第二種情況下定義向量的類型時,它指定了強類型,因此與第二個函數相匹配,並顯示int和int類型的兩個元素。

+0

這是有道理的,如果您在第一個函數中更改爲'vector ',它將顯示這些值。 – 2011-05-05 15:08:01

+0

我已更改我的代碼:http://liveworkspace.org/code/885e6909e74256038708708746d098e7 現在第二個變體不起作用。有任何想法嗎? – niXman 2011-05-05 17:07:45

+0

是因爲'variadic'類型不會轉換爲'vector1','vector2'等等。如果它需要轉換並且因此與vector0函數相匹配,它將自己簡單地轉換爲默認的'vector0'類型。但是,如果您指定這樣的功能:http://liveworkspace.org/code/3a0832f4f36d23626636fab12f0845dd。編譯器找到一個簡單的擬合,不會將其轉換爲任何指定的vectorN類。它將工作到爲該函數指定的模板參數的數量,即根據我已經表明它可用於矢量<>,矢量,矢量;不適用於矢量。 – 2011-05-06 09:40:56