2015-10-24 58 views
1

我想有一個靜態方法返回一個shared_ptr。shared_ptr的模板參數無效

它不是編譯並給模板參數1無效。

我想不通這是爲什麼。

此外,堆棧溢出說我的文章主要是代碼,我應該增加更多的細節。我不知道這是爲什麼,因爲簡潔永遠不會傷害任何人。我的問題是明確的,並且可以很容易地被詳細描述。

編譯器錯誤

src/WavFile.cpp:7:24: error: template argument 1 is invalid 
std::shared_ptr<WavFile> WavFile::LoadWavFromFile(std::string filename) 

WavFile.cpp

#include "WavFile.h" 
#include "LogStream.h" 
#include "assert.h" 

using namespace WavFile; 

std::shared_ptr<WavFile> WavFile::LoadWavFromFile(std::string filename) 
{ 
    ifstream infile;   
    infile.open(filname, ios::binary | ios::in); 
} 

WavFile.h

#pragma once 

#ifndef __WAVFILE_H_ 
#define __WAVFILE_H_ 

#include <fstream> 
#include <vector> 
#include <memory> 

namespace WavFile 
{ 
    class WavFile; 
} 

class WavFile::WavFile 
{ 

    public: 

     typedef std::vector<unsigned char> PCMData8_t; 
     typedef std::vector<unsigned short int> PCMData16_t; 

     struct WavFileHeader { 


      unsigned int num_channels; 
      unsigned int sample_rate; 
      unsigned int bits_per_sample; 
     }; 

     static std::shared_ptr<WavFile> LoadWavFromFile(std::string filename); 

    private: 
     WavFile(void); 

    private:     
     WavFileHeader m_header; 
     PCMData16_t m_data16; 
     PCMData8_t m_data8; 
}; 

#endif 
+0

嘗試添加命名空間WavFile限定符的返回值中LoadWavFromFile,即shared_ptr的的執行。是的,我知道你已經說過「使用命名空間WavFile」。但是由於名稱相同,編譯器感到困惑。 – GreatAndPowerfulOz

回答

3

更改命名空間名稱到別的東西。現在它與班級名稱衝突,因爲你是using namespace WavFile;。這說明了錯誤簡單的例子:

#include <iostream> 
#include <memory> 

namespace X // changing this to Y makes the code compilable 
{ 
    class X{}; 
} 

using namespace X;  // now both class X and namespace X are visible 
std::shared_ptr<X> v() // the compiler is confused here, which X are you referring to? 
{ 
    return {}; 
} 

int main() {} 

如果硬要有一個名爲作爲類的命名空間,然後擺脫using namespace X;和資格類型,std::shared_ptr<WafFile::WavFile>

相關問題