2009-11-02 178 views
1

我正在使用gcc 4.3.2。轉換問題

我有以下代碼(簡化):

#include <cstdlib> 

template<int SIZE> 
class Buffer 
{ 
public: 
    explicit Buffer(const char *p = NULL) {} 
    explicit Buffer(const Buffer &other); 

    const char *c_str() const { return m_buffer; } 

private: 
    char m_buffer[SIZE]; 
}; 

typedef Buffer<10> A; 
typedef Buffer<20> B; 

void Foo(A a) { 
} 

int main() 
{ 
    B b; 
    Foo(b.c_str()); // line 25 fails compilation 
    return 1; 
} 

編譯收率:

test.cpp: In function ‘int main()’: 
test.cpp:25: error: conversion from ‘const char*’ to non-scalar type ‘A’ requested 

但是有C-TOR接收常量字符*。

UDP:

如果我從第一個C-TOR刪除明確我收到

test.cpp: In function ‘int main()’: 
test.cpp:25: error: no matching function for call to ‘Buffer<10>::Buffer(A)’ 
test.cpp:7: note: candidates are: Buffer<SIZE>::Buffer(const char*) [with int SIZE = 10] 
test.cpp:25: error: initializing argument 1 of ‘void Foo(A)’ 

如果我使用美孚(A(b.c_str()))我得到:

test.cpp: In function ‘int main()’: 
test.cpp:25: error: no matching function for call to ‘Buffer<10>::Buffer(A)’ 
test.cpp:25: error: initializing argument 1 of ‘void Foo(A)’ 
+0

我發佈了一個類似的問題,但在一個更簡單的緊急情況下,有相同的問題,沒有「明確的」分心。 http://stackoverflow.com/questions/7735107/how-do-i-fix-a-const-char-constructor-conversion-chain-error-in-gcc-compile – peterk

回答

13

您的轉換構造函數聲明爲explicit。關鍵字explicit專門用於防止該構造函數的隱式轉換。而且,隱式轉換正如您期望在代碼中發生的那樣(在Foo調用中)。

爲什麼你聲明你的構造函數explicit,如果你想它在隱式轉換工作?

+0

當調用B時應該從b.c_str(),它是const char *。 A的第一個C-tor接收const char *,所以在這裏顯式不應該是個問題。我想念什麼? – dimba

+1

是的。 'explicit'意味着編譯器*不會完全做到這一點。如果你刪除顯式,它將能夠*隱式*做轉換。 – GManNickG

+2

@idimba:您正在將'const char *'傳遞給需要'A'的函數。 'const char *'不是'A',所以需要轉換。但編譯器不能使用'A :: A(const char *)'轉換構造函數,因爲它被聲明爲'explicit'。如果你想使用這個構造函數,你必須明確指出一個明確的轉換'Foo(A(b.c_str()))' – AnT

3

A和B是完全不同的類型。正如Andrey指出的那樣,沒有用於轉換的隱式可調用構造函數。您必須寫

Foo(A(b.c_str())); 

這將使用const char的顯式構造函數創建類型A的臨時'自動'(未命名)對象。這將傳遞給Foo。

+0

或者刪除'explicit',我會添加。 – GManNickG