c++命名空间解析



当我尝试构建这段代码时:

// foo.h
namespace foo {
    namespace bar {
        void put();
    }
}
#include "foo.h"
namespace foo {
    namespace {
        template<typename T>
        void put() { }
    }    
    void bar::put() {
        put<int>();
    };
}

我得到错误:

foo.cpp: In function ‘void foo::bar::put()’:
foo.cpp: error: expected primary-expression before ‘int’
foo.cpp: error: expected ‘;’ before ‘int’

显然,put<int>put指代bar::put。我如何使它在匿名命名空间中引用put<T> ?

可以完全限定函数模板的名称:

namespace foo {
    namespace bar {
        void put();
    }
}
namespace foo {
    namespace {
        template<typename T>
        void put() { }
    }
    void bar::put() {
        ::foo::put<int>();
    }
}

还需要注意的是,您不需要在函数定义后使用分号。

相关内容

  • 没有找到相关文章

最新更新