不同命名空间

时间:2018-03-23 07:01:09

标签: c++ templates

当我尝试构建代码时出现以下错误。

  

src / Test.cxx:29:错误:'模板T的专业化   com :: check :: one :: Test :: getValue(const std :: string&)'在不同的地方   namespace ./incl/Test.hxx:30:错误:来自定义   'template T com :: check :: one :: Test :: getValue(const   std :: string&)'src / Test.cxx:31:被早先的错误搞糊涂了   出

标题文件:

namespace com::check::one
{
    class Test
    {
    public:
        template<typename T>
        T getValue(const std::string& var);
    };
}

源文件:

using namespace com::check::one;

template<>
std::vector<std::string> Test::getValue(const std::string& var)
{
    //statements
}

我正在使用正确的命名空间并包含头文件。编译时没有问题。甚至我已经在源文件中定义了Test Class的其他成员函数。这些功能没有问题。只有这个函数有问题才有模板。错误是在构建期间。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

using namespace com.check.one;不是有效的语法。它应该是:

using namespace com::check::one;

更好的是,将定义包装到命名空间中:

namespace com::check::one
{
    class Test
    {
        public:
        template<typename T>
        T getValue(const std::string& var);
    };
}

namespace com::check::one
{
    template<>
    std::vector<std::string> Test::getValue(const std::string& var)
    {
        //statements
    }
}

另外,您应该阅读Why can templates only be implemented in the header file

答案 1 :(得分:1)

我希望在cpp文件中有这样的东西:

// Get external data with fetch
const data = fetch('data.json').then(response => response.json());

// Get external template with fetch
const template = fetch('template.mst').then(response => response.text());

// wait for all the data to be received
Promise.all([data,template])
.then(response => {

    resolvedData = response[0];
    resolvedTemplate = response[1];

    // Cache the template for future uses
    Mustache.parse(resolvedTemplate);

    var output = Mustache.render(resolvedTemplate, resolvedData);

    // Write out the rendered template
     return document.getElementById('target').innerHTML = output;

}).catch(error => console.log('Unable to get all template data: ', error.message));

此:

namespace com {
namespace check {
namespace one {
template<>
std::vector<std::string> Test::getValue(const std::string& var)
{
//statements
}
}
}
}

更像是Java而不是C ++。 C ++ - using namespace com.check.one; 。它用于使用命名空间,而不是用于定义命名空间。